awk命令用法
作为Linux命令三剑客之一的awk
功能非常强大,用法也较为复杂,最擅长是按列提取值,awk
结合grep
结合xargs
可以完成非常多的事,网上教程很多,我就以解析一个csv文件为例演示awk
最实用的一些功能。
test.csv内容
姓名 | 成绩 |
---|---|
张三 | 95 |
李四 | |
王五 | 98 |
平均分 | 96.5 |
文本内容
1 | 姓名,成绩 |
需求
打印除了表头(第一行)和汇总(最后一行)外所有行的第一列和最后一列,但如果最后一列是空的则这行不打印。
对于上例,打印出来应该是
1 | 张三 95 |
处理语句
1 | cat test.csv|awk 'NR>1'|awk 'NR!=1 {print prev} {prev=$0}'|awk -F, '$NF ~ /[^\t\r\n ]/ {print $1,$NF}' |
其中用到了3次awk:
第一个awk,awk 'NR>1'
,实现去掉首行
第二个awk,awk 'NR!=1 {print prev} {prev=$0}'
,实现去掉最后一行
第三个awk,awk -F, '$NF ~ /[^\t\r\n ]/ {print $1,$NF}'
,指定了,
为分隔符,当最后一列不空时打印第一列和最后一列
awk命令格式
options
最长用的就是 -F
用来指定列分割符
pattern & action
类似if
条件,可以用()括起来也可以不括,多个条件与
用&&
连接,多个条件或
用||
连接,只有满足条件才会做后面的动作,省略pattern相当于条件为真,即对每一行做action动作。action可以和{}一起省略,省略时执行默认的action输出整行。action可以是多条语句,语句间用;
分割。
pattern {action}
整体可以重复多次,表示多一行执行多组pattern {action}
。
在pattern和action中可以使用的特殊符号:
行号:NR
列数:NF
NF是一个数字,而$NF是最后一列的值。
file
即需要处理文件的文件名,通常使用awk处理来自管道的文本,所以file通常是省略的。
一个实用的例子
获取各个网口配置的IPv4
1 | ifconfig|awk 'prev ~ /.+:/ && $1=="inet" {print prev,$2} {prev=$1}' |
ifconfig的输出类似
1 | ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 |
处理后的输出为
1 | ens33: 192.168.1.242 |