1. awk grep sed
awk统计
grep查找
sed替换
一. awk
1.1 awk命令
在文件或者字符串中,基于制定规则浏览和抽取信息
awk '{pattern + action}' {filenames}
awk以行为单位,每接收一行,然后执行相应的命令
pattern :在数据中查找的内
action :找到匹配内容时所执行的一系列命令
例子如下:
awk [-F  field-separator]  'commands'  input-file(s)
执行过程:读入一行数据,按照field-separator进行划分,填充到$1-$10等域中,执行commands,再进行下一行,当然需要先执行begin,最后执行end,例子如下:
cat /etc/passwd |awk  -F ':'  'BEGIN {print "begin"}  {print $1","$7} END {print "end"}'
1.2 awk内置变量
| 变量 | 作用 | 
|---|---|
| ARGC | 命令行参数个数 | 
| ARGV | 命令行参数排列 | 
| ENVIRON | 支持队列中系统环境变量的使用 | 
| FILENAME | awk浏览的文件名 | 
| FNR | 浏览文件的记录数 | 
| FS | 设置输入域分隔符,等价于命令行 -F选项 | 
| NF | 浏览记录的域的个数 | 
| NR | 已读的记录数 | 
| OFS | 输出域分隔符 | 
| ORS | 输出记录分隔符 | 
| RS | 控制记录分隔符 | 
| $0变量是指整条记录 | |
| $1表示当前行的第一个域 | |
| $2表示当前行的第二个域... | |
| 例子如下: | 
awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
输出时,printf可以带格式
awk  -F ':'  '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
1.3 awk编程
例子
统计/etc/passwd的账户人数,count是变量,{}中的语句可以有多条,用;分开
awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd
统计某个文件夹下的文件占用的字节数
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
条件语句
和c语言类似,统计某文件夹下文件占字节大小,过滤超过4096大小文件
ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}' 
循环语句
和c语言类似:while、do/while、for、break、continue
数组
下标为key,值为value,存储在hash表中。
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
二. grep
2.1 用法
[root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename
选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
--color=auto :可以将找到的关键词部分加上颜色的显示喔!
将/etc/passwd,有出现 root 的行取出来
grep root /etc/passwd
cat /etc/passwd | grep root 
将/etc/passwd,有出现 root 的行取出来, 同时显示行号
grep -n root /etc/passwd
将/etc/passwd,将没有出现 root 的行取出来
grep -v root /etc/passwd
将/etc/passwd,将没有出现 root 和nologin的行取出来
grep -v root /etc/passwd | grep -v nologin
用 dmesg 列出核心信息,再以 grep 找出内含 eth 那行,在关键字所在行的前两行与后三行也一起捉出来显示
dmesg | grep -n -A3 -B2 --color=auto 'eth'
根据文件内容递归查找目录
grep ‘energywise’ *           #在当前目录搜索带'energywise'行的文件
grep -r ‘energywise’ *        #在当前目录及其子目录下搜索'energywise'行的文件
grep -l -r ‘energywise’ *     #在当前目录及其子目录下搜索'energywise'行的文件,但是不显示匹配的行,只显示匹配的文件
2.2 grep与正规表达式例子
[]中的内容仅代表一个字符,如果全部的字母和数字可以用[a-zA-Z0-9]
grep -n 't[ae]st' regular_express.txt
字符类的反向选择 [^] :如果想要搜索到有 oo 的行,但不想要 oo 前面有 g
grep -n '[^g]oo' regular_express.txt
假设我 oo 前面不想要有小写字节
grep -n '[^a-z]oo' regular_express.txt
我们要取得有数字的那一行
grep -n '[0-9]' regular_express.txt
行首与行尾字节 ^ $
grep -n '^the' regular_express.txt #the只在行首列出
grep -n '^[a-z]' regular_express.txt #开头字母是小写
grep -n '^[^a-zA-Z]' regular_express.txt #不想要开头是字母
^符号:在 [] 内代表『反向选择』,在 [] 之外则代表定位在行首的意义
grep -n '\.$' regular_express.txt #找出,行尾结束为小数点 (.) 的那一行
找出空白行
grep -n '^$' regular_express.txt
任意一个字节 . 与重复字节 *
o*代表空或任意个o
grep -n 'g..d' regular_express.txt #g??d字符串,中间一定有两个内容
grep -n 'ooo*' regular_express.txt #至少两个o
grep -n '[0-9][0-9]*' regular_express.txt #任意数字
限定出现次数{}
grep -n 'o\{2\}' regular_express.txt #2次以下
grep -n 'go\{2,5\}g' regular_express.txt #2-5次
grep -n 'go\{2,\}g' regular_express.txt #两个以上的另一种写法
2.3 扩展grep
grep -E 或者 egrep, 增加了额外的正则表达式元字符集
打印所有包含NW或EA的行
egrep 'NW|EA' testfile
grep 'NW\|EA' testfile #在扩展元字符前面加\自动扩展
搜索所有包含一个或多个3的行
egrep '3+' testfile
grep -E '3+' testfile
grep '3\+' testfile   
首先含有2字符,其后紧跟着0个或1个点,后面再是0和9之间的数字。
egrep '2\.?[0-9]' testfile 
grep -E '2\.?[0-9]' testfile
grep '2\.\?[0-9]' testfile 
搜索一个或者多个连续的no的行
egrep '(no)+' testfile
grep -E '(no)+' testfile
grep '\(no\)\+' testfile   #3个命令返回相同结果
2.4 不使用正则表达式
fgrep 查询速度比grep命令快,但是不能使用正则,如下两种方法
fgrep  '*' /etc/profile
grep -F '*' /etc/profile
三. sed
3.1 用法
sed [-nefri] ‘command’ 输入文本  
常用选项:
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由萤幕输出。
常用命令:
a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
3.2 例子
删除某行
sed '1d' ab              #删除第一行 
sed '$d' ab              #删除最后一行
sed '1,2d' ab           #删除第一行到第二行
sed '2,$d' ab           #删除第二行到最后一行
显示某行
sed -n '1p' ab           #显示第一行 
sed -n '$p' ab           #显示最后一行
sed -n '1,2p' ab        #显示第一行到第二行
sed -n '2,$p' ab        #显示第二行到最后一行
使用模式进行查询
sed -n '/ruby/p' ab    #查询包括关键字ruby所在所有行
sed -n '/\$/p' ab        #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义
增加一行或多行字符串
sed '1a drink tea' ab  #第一行后增加字符串"drink tea"
sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
sed '1a drink tea\nor coffee' ab   #第一行后增加多行,使用换行符\n
代替一行或多行
sed '1c Hi' ab                #第一行代替为Hi
sed '1,2c Hi' ab             #第一行到第二行代替为Hi
替换一行中的某部分
格式:sed 's/要替换的字符串/新的字符串/g'   (要替换的字符串可以用正则表达式)
sed -n '/ruby/p' ab | sed 's/ruby/bird/g'    #替换ruby为bird
sed -n '/ruby/p' ab | sed 's/ruby//g'        #删除ruby
sed -i '$a bye' ab         #在文件ab中最后一行直接输入"bye"
插入
sed -i '$a bye' ab         #在文件ab中最后一行直接输入"bye"
删除匹配行
sed -i '/匹配字符串/d'  filename
替换匹配行中的某个字符串
sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号