awk,是一个强大的文本分析工具。
它有自己的语言,简单易懂。
使用方法
awk '{pattern + action}' {filenames}
通常,awk以文件的一行为处理单位。
pattern是匹配的模式,action是执行的动作。
这样讲太抽象了,看下面的例子。
test@ubuntu:~$ awk '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
test@ubuntu:~$ awk -F: '/test/ {print $7}' /etc/passwd
/bin/bash
查找 test所在的行,并输出。第二条命令是输出test所在行的第七列,-F后面的:指定为分隔符号。
弄懂了这个接下来就好说了。下面要进行更复杂的操作。
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数(列数)
NR 已读的记录数(行号)
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。
$NF是number finally,表示最后一列的信息,跟变量NF是有区别的,变量NF统计的是每行列的总数
每列前面加上文件名和行号,可以这么写
test@ubuntu:~$ awk -F: '{print FILENAME ":" NR ":" $0 }' /etc/passwd
/etc/passwd:1:root:x:0:0:root:/root:/bin/bash
/etc/passwd:2:daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
/etc/passwd:3:bin:x:2:2:bin:/bin:/usr/sbin/nologin
/etc/passwd:4:sys:x:3:3:sys:/dev:/usr/sbin/nologin
/etc/passwd:5:sync:x:4:65534:sync:/bin:/bin/sync
.....
还可以用printf替代print,可以格式化字符串
test@ubuntu:~$ awk -F: '{printf ("%10s:%5s:%s\n",FILENAME,NR,$0) }' /etc/passwd
/etc/passwd: 1:root:x:0:0:root:/root:/bin/bash
/etc/passwd: 2:daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
/etc/passwd: 3:bin:x:2:2:bin:/bin:/usr/sbin/nologin
/etc/passwd: 4:sys:x:3:3:sys:/dev:/usr/sbin/nologin
/etc/passwd: 5:sync:x:4:65534:sync:/bin:/bin/sync
/etc/passwd: 6:games:x:5:60:games:/usr/games:/usr/sbin/nologin
......
打印第五行信息
test@ubuntu:~$ awk -F: 'NR==5{print $0}' /etc/passwd
sync:x:4:65534:sync:/bin:/bin/sync
打印倒数第4列,这一倒数第四列 $(NF-3)
test@ubuntu:~$ awk -F: '{print $(NF-3) }' /etc/passwd
0
1
2
3
打印2-5列, 这里稍微复杂一点用到了 if
test@ubuntu:~$ awk -F: '{if(NR>=2 && NR <=5 ) print $0 }' /etc/passwd
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
歇口气,再来看一个再稍微复杂一点的语句,输出文本前后增加信息,使用BEGIN和END
test@ubuntu:~$ cat /etc/passwd | awk -F: 'BEGIN{ print "---------" } {print $0} END{print "***********"}'
---------
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
sshd:x:116:65534::/var/run/sshd:/usr/sbin/nologin
guest-b1BTUi:x:117:125:Guest,,,:/tmp/guest-b1BTUi:/bin/bash
***********
到这里是不是觉得还挺简单的。
查看最近登录最多的IP信息 从其他博客看到的,蛮有意思的一条命令。
last | awk '{S[$3]++} END{for(a in S ) {print S[a],a}}' |uniq| sort -rh
23 192.168.150.1
18 :0
10 boot
1 Wed
1
里面的S[] 是一个数组哦
awk是支持,自定义变量的。除了内置变量之外。比如这个,查看文本有多少行。
test@ubuntu:~$ awk -F: '{line++;} END{print line}' /etc/passwd
37
这awk的原理,就是对文本进行一行行的处理。这个一定要明白。然后记住它的内置变量,还可以自定义变量。它还有功能,足足能写一本书,实际上确实也有awk的一本书。
《高效awk编程》足见这个命令的强大!