正则表达式之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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c# – 如何在ASP.NET MVC 6中继续使用ModelState和Redirect
- c# – 浮点到字符串转换
- visual-c – 如何检查Managed C中的“NULL对象引用”?
- react+redux教程(一)connect、applyMiddleware、thunk、w
- ruby-on-rails – 在Ruby on Rails 3应用程序中开始使用Web
- 使用JSONP的文件的正确扩展名是什么?
- VB控件属性及其一些常数(续1)
- Qt之生成XML(QXmlStreamWriter)
- 我可以给objdump一个地址,并让它反汇编包含函数吗?
- 麻烦使用Swift NSDate“timeIntervalSinceNow”