AWK程序结构
一般来说,我们每一个 awk 程序都是由一个或多个 模式–动作 语句组成的序列:
pattern { action }
pattern { action }
...
awk 的基本操作是在由输入行组成的序列中, 陆续地扫描每一行, 搜索可以被模式 匹配 (match) 的行,然后执行后面的动作。
$ awk '$3 == 0 { print $1 }' examp.data
上面的程序是模式与动作的典型例子. 程序
$3 == 0 { print $1 }
因为模式与动作都是可选的, 所以用花括号将动作包围起来, 以便区分两者
内建变量
一般来说awk有以下常用内建变量:
变量 | 字段代表意义 |
---|---|
0 | 当前记录(这个变量中存放着整个行的内容) |
$1~$n | 当前记录的第n个字段,字段间由FS分隔 |
FS | 输入字段分隔符 默认是空格或Tab |
NF | 当前记录中的字段个数,就是有多少列 |
NR | 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。 |
FNR | 当前记录数,与NR不同的是,这个值会是各个文件自己的行号 |
RS | 输入的记录分隔符, 默认为换行符 |
OFS | 输出字段分隔符, 默认也是空格 |
ORS | 输出的记录分隔符,默认为换行符 |
FILENAME | 当前输入文件的名字 |
正则表达式
匹配
为使一域匹配一正则表达式,可以使用以下两种方法:
$n~正则表达式
if($n~正则表示式) print $0
以,作为分隔符,第4列含有一个或多个字符a
awk -F ',' '{if($4~/a+/) print $2 "\t\t" $4}' command
打印以root开头的行
awk -F: '$0 ~ /^root/' /etc/passwd
和上一句等效
awk -F: '{if($0 ~ /^root/) print $0}' /etc/passwd
精确匹配
打印名字为root的用户在/etc/passwd文件中的记录
awk -F : '$1=="root" {print $0}' /etc/passwd
打印路径为/root的用户在/etc/passwd中的记录
awk -F : '$6=="/root" {print $0}' /etc/passwd