awk的语法
awk [options] ‘Pattern {Actions}’ file1,file2…
之前介绍了三种模式:空模式,关系运算模式,BEGIN/END模式
正则模式
模式可以理解成条件,正则模式就是满足正则表达式条件的,就执行相应的动作,否则不执行。
如果我们想要找到在/etc/passwd文件中,以“_krb”开头的内容该如何找呢
grep "^_krb" /etc/passwd
同样的,我们想要使用awk的方式完成这个操作,
awk '/^_krb/{print $0}' /etc/passwd
比较一下上面两种方式,grep将正则表达式放在了双引号中,awk将正则表达式放在了两个反斜杠中。
上面示例看上去是grep更加的简介,但是有一些具体的case的时候,awk显得更加美观。awk有格式化输出的功能。请读者尝试着读下面的使用方式:
注意点:1. 如果在awk的正则中使用了/,这个时候就需要使用转义字符,假如下面的需求,我们想要从passwd文件中,找到/bin/bash作为登陆shell的用户,
awk '\/bin\/bash$/{print $0} /etc/passwd'
注意点:2. 如果在正则中,需要使用形如{x,y}这种类型的表达式的时候,需要使用–posix,或者–re-interval选项
awk --posix '/he{2,3}y/{print $0} test'
行范围模式
假如有下面的文件(为了截图方便,我把文件和操作放在一起了)
文件中,hello出现了两次,world出现了一次,如果我想筛选出,hello第一次出现和world第一次出现中的所有行的内容,就使用上面的方式
总结一下就是,使用两个正则表达式,匹配所有的行,意思就是从第一个正则开始,到第二个正则结束匹配所有的行。
行范围模式另外一种方式,可以使用关系运算模式进行解决,比如打印3-6行的数据。
awk 'NR>=3 && NR<=6 {print $0}' test