说起linux下的几个用的人不多的上古神器,基本会想到sed awk,这里先总结下awk的用法。
直接上实例吧
1 | $ cat netstat.txt |
从netstat命令中提取了如上信息作为用例
输出第1列和第4例
1 | awk '{print $1, $4}' netstat.txt |
- 其中单引号中的被大括号括着的就是awk的语句,注意,其只能被单引号包含。
- 其中的$1..$n表示第几例。注:$0表示整个行。
再来看看awk的格式化输出,和C语言的printf没什么两样:
1 | awk '{printf "%-8s %-8s %-8s %-18s %-22s %-15s\n",$1,$2,$3,$4,$5,$6}' netstat.txt |
再来看看如何过滤记录(下面过滤条件为:第三列的值为0 && 第6列的值为LISTEN)
1 | awk '$3==0 && $6=="LISTEN" ' netstat.txt |
其中的“==”为比较运算符。其他比较运算符:!=, >, <, >=, <=
我们来看看各种过滤记录的方式:
1 | awk ' $3>0 {print $0}' netstat.txt |
需要表头的话,我们可以引入内建变量NR:
1 | awk '$3==0 && $6=="LISTEN" || NR==1 ' netstat.txt |
加上格式化输出:
1 | awk '$3==0 && $6=="LISTEN" || NR==1 {printf "%-20s %-20s %s\n",$4,$5,$6}' netstat.txt |
说到了内建变量,我们可以来看看awk的一些内建变量:
变量 | 含义 |
---|---|
$0 | 当前记录(这个变量中存放着整个行的内容) |
$1~$n | 当前记录的第n个字段,字段间由FS分隔 |
FS | 输入字段分隔符 默认是空格或Tab |
NF | 当前记录中的字段个数,就是有多少列 |
NR | 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。 |
FNR | 当前记录数,与NR不同的是,这个值会是各个文件自己的行号 |
RS | 输入的记录分隔符, 默认为换行符 |
OFS | 输出字段分隔符, 默认也是空格 |
ORS | 输出的记录分隔符,默认为换行符 |
FILENAME | 当前输入文件的名字 |
如果要输出行号:
1 | awk '$3==0 && $6=="ESTABLISHED" || NR==1 {printf "%02s %s %-20s %-20s %s\n",NR, FNR, $4,$5,$6}' netstat.txt |
未完待续