正则表达式之awk学习笔记

前端之家收集整理的这篇文章主要介绍了正则表达式之awk学习笔记前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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}' 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,$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

猜你在找的正则表达式相关文章