注意:本文并不是一篇awk入门文章,而是偏重实例讲解
awk借鉴了c语法,因此awk在许多地方还保留有C语言的痕迹,比如printf语句;for,if的语法结构等
介绍
最简单地说,AWK 是一种用于处理文本的编程语言工具,处理模式是只要在输入数据中有模式匹配,就执行一系列指令。awk命令格式为:
awk {pattern + action} {filenames}
awk可以读取后接的文件,也可以读取来自前一命令的标准输入,它分别扫描输入数据的每一行,查找命令行中pattern是否匹配。如果匹配,则进行后续动作action。如果pattern不匹配或action部分处理完毕,则继续处理下一行,直到结束
相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分成数个字段来处理。awk将输入数据视为一个文本数据库,像数据库一样,它也有记录和字段的概念。默认情况下,记录的分隔符是回车,字段的分隔符是空白符(空格,\t),所以输入数据的每一行表示一个记录,而每一行中的内容被空白分隔成多个字段。利用字段和记录,awk可以非常灵活地处理文件
语法
1 语法
一个典型的awk语法如下:
awk '{
BEGIN{stat1}
BEGIN{stat2}
pattern1{action1}
pattern2{action2}
...
patternn{actionn}
{默认动作,无条件,始终执行}
END{stat1}
END{stat2}
}'
其中BEGIN为处理文本前的操作,一般用于改变FS,OFS,RS,ORS等,BEGIN部分完成之后,awk读取第一行输入,并将第一行的数据填入0,0, 1,$2,NR,NF等变量,然后进入正式处理阶段,待所有行处理完毕之后,进入END部分,END一般用于总结,打印报表等。正式处理是一个内建的循环,每一次循环读取一行数据,每一行的处理分为多模式,多动作,文本行符合条件pattern1就执行动作action1符合pattern2就执行动作action2…,还可以有默认的动作, 即没有pattern判断,始终执行此{}内的action。
BEGIN,END部分不是必须出现,可以没有,也可以有任意多个
pattern部分的写法有:
/reg/: 在整行范围内匹配reg,匹配到就执行后续动作
! /reg/: 整行没匹配到reg,才执行后续动作
$1 ~ /reg/:只在第一字段匹配reg
$1 !~ /reg/: 不匹配
NR>=2: 从第二行开始处理
pattern,部分和随后的if,for部分,能用到的符号有:
2 内建变量
$0当前记录(这个变量中存放着整个行的内容)
$1~$n
当前记录的第n个字段,字段间由FS分隔
FS
输入字段分隔符 默认是空格或\t
NF
当前记录中的字段个数,就是有多少列
NR
已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
FNR
当前记录数,与NR不同的是,这个值会是各个文