awk

awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息

awk处理过程: 依次对每一行进行处理,然后输出

特殊要点:

$0           表示整个当前行
$1           每行第一个字段
NF          字段数量变量
NR          每行的记录号,多文件记录递增
FNR        与NR类似,不过多文件记录不递增,每个文件都从1开始
\t            制表符
\n           换行符
FS          BEGIN时定义分隔符
RS       输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~            匹配,与==相比不是精确比较
!~           不匹配,不精确比较
==         等于,必须全部相等,精确比较
!=           不等于,精确比较
&&      逻辑与
||             逻辑或
+            匹配时表示1个或1个以上
/[0-9][0-9]+/   两个或两个以上数字
/[0-9][0-9]*/    一个或一个以上数字
FILENAME 文件名
OFS      输出字段分隔符, 默认也是空格,可以改为制表符等
ORS        输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F'[:#/]'   定义三个分隔符

删除文件 text中第一列

awk '{$1="";print $0}' text

打印text中的第二列

awk '{print $2}' text

打印倒数第N列

倒数第一列、也就是最后一列,就用$(NF),倒数第二列就是$(NF-1)

alvin@poppy:~$ cat ok.txt
1:2:3:4:5:6:7:8:9
alvin@poppy:~$ awk -F ":" '{print $(NF-2)}' ok.txt
7
alvin@poppy:~$ awk -F ":" '{print $(NF-1)}' ok.txt
8
alvin@poppy:~$ awk -F ":" '{print $(NF)}' ok.txt
9

指定值运算

NR就是$1, 上面的示例中,我们没有加括号,不加括号代表运算,所以会把$1的结果-2

alvin@poppy:~$ echo $MYIP
116.226.183.63
alvin@poppy:~$ echo $MYIP|awk -F "." '{print $NR-2}'
114

NR就是$1, 上面的示例中,我们没有加括号,不加括号代表运算,所以会把$1的结果-2

列的加减

而在下面的示例中,我们加了括号,那就不是把结果+1,而是将列的数加1。

alvin@poppy:~$ echo $MYIP
116.226.183.63
alvin@poppy:~$ echo $MYIP|awk -F "." '{print $(NR+1)}'
226
alvin@poppy:~$

这里我们要注意的就是,NR+数字之后的括号

指定列匹配,然后打印匹配到行的指定列

awk '($3 ~ "ext2|ext3|ext4|reiserfs|xfs") { print $2 }' /etc/fstab

指定列比较匹配,然后打印匹配行的指定列

以:作为分割符,匹配第三列大于500的行,打印第6列。

awk -F: '($3 >= 500) { print $6 }' /etc/passwd