【命令名称】 awk
【使用权限】 所有人
【语法】
awk -F ‘[分隔符]+’ ‘条件类型{动作}’ filename
【功能说明】
把一行分成数个栏进行处理
【常用参数】
-F 后面跟分隔符,可以加多个,默认为空格 取代FS
NR 目前处理第几行
NF 每一行拥有的列总数
【实例】
先显示文件的内容:
[cxc@cxcserver ~]$ cat cxc.txt
15:30 cxc
15:31 myx
15:37 czq
15:50 zcy
17:50 zn
10:32 aaa
10:59 bbb
1.默认以空格进行分格符:
[cxc@cxcserver ~]$ awk '{print $1}' cxc.txt
15:30
15:31
15:37
15:50
17:50
10:32
10:59
2.以空格和冒号为分格符:
[cxc@cxcserver ~]$ awk -F '[ :]+' '{print $1 "\t" $2 "\t" $3}' cxc.txt
15 30 cxc
15 31 myx
15 37 czq
15 50 zcy
17 50 zn
10 32 aaa
10 59 bbb
3.显示出包含cxc字符的行
[cxc@cxcserver ~]$ awk '/cxc/' cxc.txt
15:30 cxc
4.取范围,非常有用,分析日志可以用
[cxc@cxcserver ~]$ awk '/15:30/,/17:50/' cxc.txt #取范围内容,这条很有用,
15:30 cxc
15:31 myx
15:37 czq
15:50 zcy
17:50 zn
5.以空格分隔后,取出第二列为cxc的行,cxc必须用双引号
[cxc@cxcserver ~]$ awk '$2=="cxc"' cxc.txt
15:30 cxc
6.以空格冒号为分隔后,第一列为15的行
[cxc@cxcserver ~]$ awk -F '[ :]+' '$1==15' cxc.txt
15:30 cxc
15:31 myx
15:37 czq
15:50 zcy
7.特殊用法,必须掌握
[cxc@cxcserver ~]$ awk '{++count;} END {print count}' cxc.txt
8
8.打印最后一列
[cxc@cxcserver ~]$ awk '{print $NF}' cxc.txt
cxc
myx
czq
zcy
zn
aaa
bbb
9. 打印倒数第二例
[cxc@cxcserver ~]$ awk '{print $(NF-1)}' cxc.txt
15:30
15:31
15:37
15:50
17:50
10:32
10:59
19:23
列出cxx.txt内容
[cxc@cxcserver ~]$ [cxc@cxcserver ~]$ cat cxx.txt
a 1
b 2
c 3
d 4
10. 计算第二列的和
[cxc@cxcserver ~]$ awk 'BEGIN{sum=0} {sum+=$NF} END{print sum}' cxx.txt
10
11.取出IP地址
[cxc@cxcserver ~]$ ifconfig eth0 |awk -F '[: ]+' 'NR==2 {print $4}'
192.168.20.242
12.分别计算passwdj里最后shell种类个数
[cxc@cxcserver ~]$ cat /etc/passwd|awk -F ':''{print$NF}'|sort|uniq
3 /bin/bash
1 /bin/sync
1 /sbin/halt
18 /sbin/nologin
1 /sbin/shutdown
13.另一种计算方法,十分有用 end要大写
[cxc@cxcserver ~]$ cat /etc/passwd|awk -F ':' '{++state[$NF]} END {for (a in state) print a "\t" state[a]}'
/sbin/shutdown 1
/bin/bash 3
/sbin/nologin 18
/sbin/halt 1
/bin/sync 1
14.统计netstat各连接数
[cxc@cxcserver ~]$netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
LAST_ACK 1 SYN_RECV 14
ESTABLISHED 79
FIN_WAIT1 28
FIN_WAIT2 3
CLOSING 5
TIME_WAIT 1669