文章目錄

不论什么时候如果要做文本分析awk是必不可少的,它可以大大提高文本分析的效率,它强大且高效。

awk基本格式

awk -F ‘:’ ‘BEGIN{…} {…action} END{…}’ File

awk的动作流程

  1. 执行BEGIN里的内容,一般是一些初始化操作。
  2. 读入File文件的一行内容,以\n为分隔符,然后把这一行按-F后的分隔符分成N个域,$0表示整行内容,$1表示第1个域的内容,$2表示第2个域的内容,以此类推.
  3. 执行{…action}中的代码,一般是针对当前行内容的操作,例如模式匹配打印等。
  4. 执行END中的代码,一般是些结果打印

看起来比较复杂,其实使用中-F BEGIN END这些字段都是不必须的,例如打印最近登录的5个账号:

last -n 5 | awk ‘{print $1}’

因为账号名称在第一个域,所以只需要 awk ‘{print $1}’ 就能打印出来了,-F不指定的话默认已空格和制表符分隔,BEGIN、END可省略。
awk语法和c语言很像,继承了c语言的风格,如下面统计了文件里有多少匹配行:

1
awk -F ':' 'BEGIN {count=0;print "init=",count} {if($1~/root/) {count=count+1;print $0}} END{print "count=",count}' /etc/passwd

其中匹配可以这样简写

1
awk '$1~/root/{print $0}' /etc/passwd

/ /中间内容按照正则表达式匹配。

简单匹配也可以这样,^表示开头,$表示结尾

1
2
3
4
awk -F":" '$1~/^root$/{print $0}' /etc/passwd  
awk -F":" '$1=="root" {print $0}' /etc/passwd
awk -F":" '{if($1=="root"||$1~/mysql/) {print $0}}' /etc/passwd
awk -F":" 'BEGIN{OFS=":"}{gsub("root","mysql",$1);print $0}' /etc/passwd

awk里内嵌了很多处理函数,例如length sub gsub substr match split tolower toupper print printf rand srand sin cos int log systime strftime等,使用方法基本和c语言一致。
awk里还有一些常用内部变量,例如 FILENAME awk处理的文件名 NR 已读取的记录数 NF 域的个数 FS 域分隔符设置,等价于-F OFS 设置输出域分隔符 RS 记录分隔符 ORS 输出记录分隔符。

文章目錄