awk正则表达式学习笔记


AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得

自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识。在最初

创造 AWK 时,其目的是用于文本处理,并且这种语言的基础是,只要在输入数据中有模式匹配,就执行一系列指令。该实用工具扫

描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,

则继续处理下一行。


gawk 是 AWK 的 GNU 版本。


注:sed和awk都是流式编辑器,是针对文档的行来操作的。


匹配:

awk -F ':' '{print $3,$4}' 1.txt 


awk -F ':' 'OFS=":" {print $3,$4}' 1.txt   //通过OFS=":"用冒号对匹配的结果进行分隔。注意加等于号。

#当文本文档某个段发生改变,文本文档会以空格为分隔符。如果想设置分隔符,就要使用OFS="".

awk -F ':' 'OFS="#" {print $3,$4}' 1.txt 


awk -F ':' 'OFS=":" {print $3,$4,$1}' 1.txt  //可以把$1放到最后。


awk  '/user/'  1.txt     //匹配User的行。


awk  '/user|root/'  1.txt    //匹配user或root的行。


awk  '/r*o/' 1.txt  


awk   '/r?o/' 1.txt   


awk   '/r+o/'  1.txt


awk   '/r.*o/' 1.txt     //贪婪匹配。


awk   '/(oo)+/'  1.txt    //一个或多个(oo).


grep -E  --color  'oo{2,10}' 1.txt   //grep和sed都支持花括号。


sed   -r  -n '/(oo){2,10}/'p  1.txt 


awk  -F ':'  '$1~/r*o/'  1.txt   //~表示去匹配的意思。用$1去匹配/r*o/.


awk  -F ':'  '$1~/r*o/  {print $3}'  1.txt  //用$1去匹配/r*o/,但只显示第三段。


awk  -F ':'  '$1~/r*o/  {print $1,$3};$1~/user/ {print $1,$3}'  1.txt 


awk  -F ':'  '$1~/r*o/  {print $1,$3};$1~/nologin/ {print $1,$3}'  1.txt 


#awk和sed是流编辑器,表达式相当过滤器,每一行都从过滤器穿过,如果匹配就显示出来。

#上述正则表达式有两个表达式,相当于两个过滤器。


awk  -F ':'  '$1~/r*o|nobody/  {print $1,$3}'  1.txt 


条件操作符:


awk -F ':' '$1=="root"'  1.txt


awk -F ':' '$1=="root" {print $1}'  1.txt


awk -F ':' '$1=="nobody" || $7 ~/false/'  1.txt


awk -F ':' '$1=="nobody" && $7 ~/false/'  1.txt


awk  -F ':' '$1>=500' 1.txt


awk  -F ':' 'int($1)>=500' 1.txt  //通过int()或*1,使$1被当成一个数值。


awk  -F ':' '$3>=“500”' 1.txt   //500加上双引号后,$3会通过ASC码的方式去排序。6也会被显示出来,因为它的ASC码值比5大。


awk  -F":"   '$7!="/sbin/nologin" ' 1.txt


awk  -F":"   '$7!~/nolog/' 1.txt   //$7不匹配nolog.


awk  -F ':'  '$3<$4' 1.txt


awk  -F ':'   '$3==$4'  1.txt


awk  -F ':'   '$3=$4'  1.txt  //把$4的值赋给$3.


awk  -F ':'   'OFS=":";$3=$4'  1.txt


awk  -F ':'   'OFS=":";{if($3>100) $7=$3+$4}'  1.txt

内置变量:


awk  -F ':'  'NR<10' 1.txt  //NR表示行。


awk  -F ':'  'NR<10' 1.txt  


awk  -F ':'  'NR==10' 1.txt  


awk  -F ':'  'NR==10 {print $1,$5}' 1.txt


awk  -F ':'  '{if(NR==10) print $1,$5}' 1.txt


awk  -F ':'  'OFS=":" {if(NR==10) print $1,$5}' 1.txt


awk  -F ':'  '{print NF}' 1.txt  //NF表示段。


awk  -F ':'  '{if(NF==7) print $1}' 1.txt  


awk  -F ':'  '{print $NR,$NF}' 1.txt 


awk  -F ':'  '{print $7=$3+$4}' 1.txt 


awk  -F ':'  '$7=$3+$4' 1.txt 


awk  -F ':'  'OFS=":" $7=$3+$4' 1.txt 


awk  -F ':'  'OFS=":" {$7=$3+$4 ;print $0}' 1.txt

#赋值&&判断语句放到花括号内部,OFS放到花括号外部。


awk  -F":"  '{(sum=sum+$3)};{print sum}' 1.txt  //等价于awk  -F":"  '{(sum+=$3)};{print sum}' 1.txt


awk  -F":"  '{(sum=sum+$3)};END{print sum}' 1.txt //END表示循环结束。

截取文档中的某个段 :

-F //指定分隔符,如不加-F去指定,则默认以空格或TAB进行分隔。

print //表示打印动作,用来打印某个字段,$1表示第一字段,$2表示第二字段,$0表示整行。


EG:

 awk -F ':' '{print $1}'   //在suse中无法以#、@等进行分隔。


 awk -F ':' '{print $0}'   //打印整行。


awk -F  ':'  '{PRINT $1“#”$2“#”$3“#”$4}'    //打印多个字段。#等分隔符用双引号,单引号无效。




匹配字符或字符串:


awk -F ':'  '/root/'  test001.txt     //匹配root.


awk -F ':' '/root/ {print $1,$3}  /man/ {print $1,$3}'  test001.txt    //先匹配root,后匹配man.


条件操作符:


awk -F ':' '$3=="0"'  test001.txt   

awk -F ':' '$3=="0"   {print $3,$4}'  test001.txt


awk -F ':'  '$3>="500"  {print $3}'  test001.txt   //此结果并没像预期所想一样,500被当成字符了。


awk  -F ':'  '$7!="/bin/false"'   test001.txt      // !=为不匹配。


awk  -F ':'  '$3>$4 {print $3,$4} ' test001.txt   


awk -F  ':'  '$3>"100"&&$3<"65535"  {print $3,$4}' test001.txt  //此结果并没像预期所想一样,数字被当成字符了。


awk -F  ':'  '$3>"5" ||$7!="/bin/bash"' test001.txt


awk的内置变量


awk常用的变量有:


NF  //用分隔符分隔后一共有多少段


NR  //行数


awk -F ':' '/root/ {print $NF}'  test001.txt


head -n3  test001.txt |awk -F ':' '{print NF}'


head -n3  test001.txt |awk -F ':' '{print NR}'


可以使用行号作为判断条件:


awk  -F ':' 'NR>10' test001.txt


awk中的数学运算 


awk可以把段值更改:


head -n3 test001.txt |awk -F ':' '$1="root"'


awk还可以对各个段的值进行数学运算:


head -n3 test001.txt |awk -F ':'  '$7=$3+$4 {print $3,$4,$7}'


当然还可以计算某个段的总和


awk -F ':' '{(sum=sum+$3)};END{print sum}' test001.txt


awk -F ':' '{if($1=="root")print $0}' test001.txt



用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test001.txt)

 awk -F ':' '{print $0}' test001.txt

查找所有包含 ‘bash’ 的行 

awk -F ':' '/bash/' test001.txt

用 ‘:’ 作为分隔符,查找第三段等于0的行 

awk -F ':' '$3==0 ' test001.txt

用 ‘:’ 作为分隔符,查找第一段为 ‘root’ 的行,并把该段的 ‘root’ 换成 ‘toor’ (可以连同sed一起使用)

awk -F ':' '$1=="root"'  test001.txt|sed 's/root/toor/g'

用 ‘:’ 作为分隔符,打印最后一段 

awk -F ':' '{print $NF}' test001.txt

打印行数大于20的所有行 

awk  -F ':' 'NR>20' test001.txt

用 ‘:’ 作为分隔符,打印所有第三段小于第四段的行 

awk -F ':' '$3<$4' test001.txt

用 ‘:’ 作为分隔符,打印第一段以及最后一段,并且中间用 ‘@’ 连接 (例如,第一行应该是这样的形式 'root@/bin/bash‘ )

awk -F ':' '{print $1"@"$NF}' test001.txt 

用 ‘:’ 作为分隔符,把整个文档的第四段相加,求和 

awk -F ':' '{(sum=sum+$4)};END{print sum}' test001.txt


//cat bigip_gtm.conf  |grep wideip  |awk '{print $3}' |awk -F "/" '{print $3}' > /tmp/domain.txt