sed命令以行为单位,awk命令以列为单位。
awk按行读取文本并视为一条记录,每条记录以字段分割成若干字段,然后输出各字段的值。
awk的语法异常复杂,之前在看《鸟哥的Linux私房菜》时对其理解不深,现在结合《Linux系统命令其Shell脚本实践指南》再学习一遍。
awk认为文件都是结构化的,也就是说都是由单词和各种空白字符组成的,这里的“空白字符”包括空格、Tab,连续的空格和Tab等。非空白的地方叫做域,从左到右依次是第一个域、第二个域,表示为$1、$2等等,$0表示全部的域。
这里依然使用dmesg作为test文件:
$ dmesg >> dmesg.log
打印指定的域:
$ awk '{print $1,$2,$3}' dmesg.log
使用" -F "指定分隔符:
$ awk -F: '{print $1,$2}' dmesg.log
内部变量NF,获取域的个数:$ awk '{print NF}' dmesg.log
打印最后一列域:$ awk '{print $NF}' dmesg.log
打印倒数第二列域:$ awk '{print $(NF-1)}' dmesg.log
length变量,确定字符串的长度:$ awk '{print length}' dmesg.log
求列和:
比如求dmesg.log里面第二列的和,先找出时间所在的列:
$ cat dmesg.log
[ 0.000000] microcode: microcode updated early to revision 0x9e, date = 2016-06-22
[ 0.000000] Linux version 4.10.10-100.fc24.x86_64 (mockbuild@bkernel01.phx2.fedoraproject.org)
……
$ awk -F[ '{print $2}' dmesg.log | awk -F] '{print $1}'
0.000000
0.000000
$ awk -F[ '{print $2}' dmesg.log | awk -F] '{print $1}' | awk 'BEGIN{total=0}{total+=$1}END{print total}'
1.47903e+07
awk命令处理文本也非常强大。配合sed使用,快捷方便。这样对文本的操作就不用每次都进入Vim了,在shell脚本里vim无用武之地,而awk和sed无往不利。
文章评论(0条评论)
登录后参与讨论