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