0x00 简介
awk 命令,即著名的三剑客指令,取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的姓氏首字母作为命名,是一款十分强大的文本分析工具。实际上,awk本身有自己的语言: AWK 程序设计语言,是一种 " 样式扫描和处理语言 " ,可应用于各种计算和数据处理任务。通常,awk是以文件的一行为处理单位的。
usage: awk '{pattern + action}' {filenames}
其中, pattern 表示 AWK 在数据中查找的内容,可以为正则表达式; 而 action 是在找到匹配内容时所执行的一系列命令。
awk 在 linux 中有三种调用方式,分别为命令行方式:
awk [-F 可选的域分隔符] ‘commands’ [带处理文件]
awk脚本方式:
awk [-f script] [file]
shell脚本方式:
#!/bin/awk
#使用 awk 解释器执行该脚本
0x01 基本使用
打开一个 shell 窗口,使用命令行方式调用 awk 完成工作:
实例1:
通过管道符与 awk 结合 netstat 命令查看与本机通信的 ip 地址:
root@inv@1id:~# netstat -pantu
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 639/sshd
tcp 0 0 172.16.12.52:34148 203.208.39.249:443 TIME_WAIT -
tcp 0 0 172.16.12.52:39278 203.208.43.122:443 ESTABLISHED 1898/firefox-esr
tcp 0 0 172.16.12.52:58494 47.95.47.253:443 ESTABLISHED 1898/firefox-esr
tcp 0 0 172.16.12.52:52434 120.92.150.127:7823 ESTABLISHED 1898/firefox-esr
tcp 0 0 172.16.12.52:60784 202.89.233.101:443 ESTABLISHED 1898/firefox-esr
tcp 0 0 172.16.12.52:56686 115.223.14.213:443 ESTABLISHED 1898/firefox-esr
tcp6 0 0 :::22 :::* LISTEN 639/sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 3238/dhclient
先把tcp|udp开头的筛选出来:
root@inv@1id:~# netstat -pantu | awk '/^(tcp|udp)/{print $5}'
0.0.0.0:*
203.208.43.122:443
47.95.47.253:443
120.92.150.127:7823
202.89.233.101:443
115.223.14.213:443
:::*
0.0.0.0:*
再删去0.0.0.0 或 :::
root@inv@1id:~# netstat -pantu | awk '/^(tcp|udp)/{print $5}' | awk '/^[1-9][\d]*?/'
47.95.47.253:443
120.92.150.127:7823
115.223.14.213:443
最后再把端口号去掉:
root@inv@1id:~# netstat -pantu | awk '/^(tcp|udp)/{print $5}' | awk '/[1-9][\d]*?/' | awk -F: '{print $1}'
47.95.47.253
120.92.150.127
115.223.14.213
-F参数后紧跟域分隔符,(缺省值为空格)
可见,我们在筛选时只使用awk就可以完成cut、grep等命令组合才能完成的功能;
(注: 上述案例中最后得到的结果明显少于第一次执行netstat的结果,只是因为在筛选的过程中我的计算机关闭了某些连接,命令是正确的)
----------------------------------------------------------------------------------------------------------------------------------------------------
实例2: 使用 -v 参数设置变量:# awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
2 3 2s
3 4 3s
This's 1 This'ss
10 11 10s
0x02 内置变量
awk有许多内置变量用来设置环境信息:
ARGC | 命令行参数个数 |
---|---|
ARGV | 命令行参数排列 |
ENVIRON | 支持队列中系统环境变量的使用 |
FILENAME | awk浏览的文件名 |
FNR | 浏览文件的记录数 |
。。。
$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域。。。
0x03 数组
awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)
实例:
# awk -F: 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
0 root
1 daemon
2 bin
3 sys
4 sync
5 games
6 man
...
----------------------------------------------------------------------------------------------------------------------------------------------------
总而言之,awk 是一款非常强大的文本分析工具,希望大家能从中受益;
----------------------------------------------------------------------------------------------------------------------------------------------------
参考:
https://www.runoob.com/linux/linux-comm-awk.html
https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html