awk可以算一种单独的语言了,太深奥,我只知一点皮毛,就写一点平时经常用到的.
awk基本语法格式:
awk [选项] ‘模式{动作}’ file
awk的默认分隔符为空格
-F “:” 指定:为分隔符
-F “[,;]” 指定多分隔符, ,;都算分隔符
-F “[ ;]+” 指定多分隔符,写上+号表示,多个空格或;也表示一个分隔符
$NF 为最后一列
$(NF-1) 倒数第二列
$0 整行内容
NR代表行号
例:
1 取出指定行号
awk ‘{if (NR>10 && NR<12) print $1 }’ /etc/passwd
operator❌11:0:operator:/root:/sbin/nologin
awk ‘NR==11 {print $1 }’ /etc/passwd
operator❌11:0:operator:/root:/sbin/nologin
2 打印指定列
打印倒数第二列
awk -F “:” ‘{print $(NF-1)}’ /etc/passwd
3 提取ip地址
[root@tom01 ~]# ifconfig|awk -F “[ :]+” ‘NR==2 {print $4}’
192.168.56.7
4 打印文件中行号以及内容
awk ‘{print NR "\t " $0}’ /etc/passwd
5 提取文件test.txt(I am tom my qq xxxxxx)中的名字和qq号
[root@tom01 ~]# awk ‘{print $3 " " $6}’ test.txt
tom xxxxxx
提取文件test.txt(I am tom,my qq xxxxxx)中的名字和qq号
[root@tom01 ~]# awk -F “[ ,]” ‘{print $3 " " $6}’ test.txt
tom xxxxxx
6 /etc/passwd文件有多少行
awk ‘{print NR}’ /etc/passwd |tail -1
7 不显示文件中的空白行
awk /[^$]/ README.txt
8 处理以下文件内容,将域名取出并根据域名进行计数排序处理:
http://www.baidu.org/index.htmL
http://www.baidu.org/1.html
http://post.baidu.org/index.html
http://mp3.baidu.org/index.html
http://www.baidu.org/3.html
http://post.baidu.org/2.html
方法1
[root@tom01 ~]# awk -F “/” ‘{print $3}’ test.txt |sort|uniq -c|sort -r
3 www.baidu.org
2 post.baidu.org
1 mp3.baidu.org
方法2
[root@tom01 ~]# awk -F “/” ‘{S[$3]++}END{for(n in S) print S[n],n}’ test.txt |sort -rn
3 www.baidu.org
2 post.baidu.org
1 mp3.baidu.org
9 统计web日志单ip访问请求排名,取出前十名
方法1
[root@tom01 ~]# awk ‘{print $1}’ access_bbs.log |sort|uniq -c|sort -rn |head
702 119.61.26.106
525 36.110.58.98
107 120.52.18.55
92 120.52.18.59
92 120.52.18.58
89 120.52.18.60
81 120.52.18.57
75 120.52.18.48
61 106.121.62.181
57 120.52.18.47
方法2
[root@tom01 ~]# awk ‘{S[$1]++}END{for (n in S) print S[n],n}’ access_bbs.log |sort -rn|head
702 119.61.26.106
525 36.110.58.98
107 120.52.18.55
92 120.52.18.59
92 120.52.18.58
89 120.52.18.60
81 120.52.18.57
75 120.52.18.48
61 106.121.62.181
57 120.52.18.47
10 服务器不同网络连接状态对应的数量
方法1
[root@VM_16_7_centos ~]# netstat -ant|awk ‘/^tcp/ {print $NF}’|sort|uniq -c|sort -rn
24 ESTABLISHED
11 LISTEN
5 CLOSE_WAIT
1 TIME_WAIT
方法2
[root@VM_16_7_centos ~]# netstat -ant|awk '/^tcp/ {S[$NF]++}END{for(n in S) print S[n],n}'|sort -rn
25 ESTABLISHED
11 LISTEN
5 CLOSE_WAIT
方法3
[root@VM_16_7_centos ~]# ss -ant|awk ‘NR>1 {print $1}’ | sort |uniq -c|sort -rn
24 ESTAB
11 LISTEN
5 CLOSE-WAIT
11 分析图片服务日志.把日志(每个圈片访问次致.图片大小的总和)排行,取top10
awk ‘{print $7 " " $10}’ access_bbs.log |sort|uniq -c|awk ‘{print $1*$3 " " $2 " " $1 }’|sort -rn|head
3103955 / 43
2292724 /index.php?m=Home&c=Cart&a=header_cart_list 28
1882987 /index.php?m=Home&c=Cart&a=header_cart_list 23
1743528 /static/home/images/global.png 4
1055582 /static/home/js/jquery-1.11.3.min.js 11
881750 /uploads/Carousel/20171207/20171207101806691.jpg 5
862110 /static/home/js/jquery.min.js 9
818900 /index.php?m=Home&c=Cart&a=header_cart_list 10
739840 / 64
671980 /uploads/Carousel/20171013/20171013144425854.jpg 4
12 将/etc/passwd文件的所有列反转
awk -F “:” ‘{print $7":"$6":"$5":"$4":"$3":"$2":"$1}’ /etc/passwd
13 匹配第三列中以61开头的信息 然后输出源文件中整行信息中的第一列 第二列
awk ‘$3~/^61/ {print $1,$2}’ awk.txt
14 awk替换动作
gsub
动作格式
gsub(/需要替换的信息/,“修改成什么信息”,将那列信息修改)
修改最后一列,把:修改为$
awk '{gsub(/:/,"$",$NF);print $1,$3}'
15 BEGIN 在执行命令之前进行的操作
在操作之前向首行添加信息,BEGIN
awk ‘BEGIN{print “UUID”,“挂载点”,“分区格式”,“挂载参数”}{print $0}’ fstab|column -t
注:column -t是对齐文件命令
16 END 在执行命令之后进行的操作
统计passwd文件中最后一列nologin出现的次数
awk -F ":" '$NF~/nologin/{i++}END{print i}' /etc/passwd
或
awk -F ":" '$NF~/nologin/{i=i+1}END{print i}' /etc/passwd
17 求和运算
seq 10 |awk -F “:” ‘{sum=sum+$1;print sum}’
sum是一个变量可以随意定义