awk简题
一、按单词出现频率降序排序(计算文件中每个单词的重复数量)
创建题目:sed -r 's#[^a-zA-Z]+# #g' /etc/passwd > /root/www
解答:
1.awk 'BEGIN{RS="[ ]+"}{print $0}' count.txt | sort |uniq -c | sort
2.cat www | xargs -n1 | sort | uniq -c | sort
3.cat count.txt | tr " " "\n" | sort | uniq -c | sort
4.grep -o "[a-zA-Z]\+" count.txt | sort | uniq -c | sort
awk记录知识小结:
- NR存放着每个记录的号(行号)读取新行时候会自动+1
- RS是输入数据的记录的分隔符,简单理解就是可以指定每个记录的结尾标志。
- RS作用就是表示一个记录的结束
- 当我们修改了RS的值,最好配合NR(行)来查看变化,也就是修改了RS的值通过NR查看结果,调试awk程序。
- ORS输出数据的记录的分隔符
二、同时取出zhuangzhuang和123456这两个内容(指定多分隔符)
创建题目:echo "I am zhuangzhuang,my qq is 123456" > /root/www
解答:awk -F "[ ,]" '{print $3,$NF}' /root/www
三、以下图为题目,解答小题
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
文件说明:第一列是姓氏,第二列是名字,第三列是对应的ID号码,最后三列是三次捐款数量
1.显示姓Zhang的人的第二次捐款金额及她的名字
awk -F "[ :]+" '$1~/^Zhang/{print $2,$(NF-1)}' /root/www
2.显示Xiaoyu的名字和ID号码
awk -F "[ :]+" '$2~/^Xiaoyu/{print $1,$3}' /root/www
3.显示所有以41开头的ID号码的人的全名和ID号码
awk -F "[ :]+" '$3~/^(41)/{print $1,$2,$3}' /root/www
4.显示所有以一个D或X开头的人名全名
awk -F "[ :]+" '$2~/^D|^X/{print $1,$2}' /root/www
5.显示所有ID号码最后一位数字是1或5的人的全名
awk -F "[ :]+" '$3~/1$|5$/{print $1,$2}' /root/www
6.显示Xiaoyu的捐款,每个值都有以开头。如 520200135
awk -F "[ :]+" '$2~/Xiaoyu/{print "$"$4"$"$5"$"$6}' /root/www
7.显示所有人的全名,以姓,名的格式显示,如Meng,Feixue
awk -F "[ ]+" '{print $1","$2}' /root/www
四、取出网卡eth0的IP地址
1.hostname -l
2.ifconfig eth0 | awk 'BEGIN{RS="[ :]"}NR==31'
3.ifconfig eth0 | awk -F "(addr:)|( Bcast:)" 'NR==2{print $2}'
4.ifconfig eth0 | awk -F "[ :]+" 'NR==2{print $4}'
5.ifconfig eth0 | awk -F "[^0-9.]+" 'NR==2{print $2}'
五、取出常用服务端口号和常用服务端名称
解答:端口号:awk -F "[ /]+" '$1~/^(ssh)$|^(http)$|^(https)$|^(mysql)$|^(ftp)$/{print $1,$2}' /etc/services | sort | uniq -c | sort -n
服务名称:awk -F "[ /]+" '{print $1}' /etc/services | sort | uniq -c | sort -n
六、取出文件/etc/services的23~30行
解答:
1.awk 'NR>=23&&NR<=30' /etc/services
2.awk 'NR>22&&NR<31' /etc/services
七、找出/etc/passwd中第五列是root的行
解答:
1.awk -F":" '$5=="root"' /server/files/awk_equal.txt
2.awk -F":" '$5~/^root$/' /server/files/awk_equal.txt
八、统计/etc/servies文件里的空行数量
解答:
1.grep "^$" /etc/services | wc -l
2.grep -c "^$" /etc/services
3.awk '/^$/{i++}END{print i}' /etc/services
awk模式与动作小结:
awk命令核心由模式和动作组成
- 模式就是条件,动作就是具体干什么
1)正则表达式:必须掌握正则,熟练
2)条件表达式:比大小,比较是否相等
3)范围表达式:从哪里来到哪里去 - 注意BEGIN或END模块只能有一个。BEGIN{}BEGIN{}或者END{}END{}都是错误的。
九、统计域名访问次数
查看一下内容:awk -F "[/]+" '{print $2}' file
(这是我们要统计的内容)
计数:awk -F "[/]+" '{i++;print $2,i}' file
(i++;i 最开始是空的,当awk读取一行,i自身+1)
用数组替换i:awk -F "[/]+" '{h[$2]++;print $2,h["www.etiantian.org"]}' file
- 将i替换成h[$2];相当于我创建了一个数组h[],然后用$2作为我的房间号。但是目前房间里是没有东西的。也就是说h[$2]=h["www.etiantian.org"] and h["post.etiantian.org"] and h["mp3.etiantian.org"] 但是具体房间里是没有东西的也就是空。
h[$2]++就等于i++:也就是说我开始给房间里加东西;当出现同样的东西,我就++
print h["www.etiantian.org"]:意思就是说我开始要输出了。我要输出的是房间号为“www.etiantian.org”里面的内容。这里面的内容最早是空的,随着awk读取每一行一旦出现房间号为“www.etiantian.org”的房间时,我就给房间里的内容进行++。
综上,输出的结果中,每次出现www.etiantian.org时,h["www.etiantian.org"]就会++。因此最后的输出数字是3
输出最终计数结果:awk -F "[/]+" '{h[$2]++}END{for(i in h)print i,h[i]}' file
- 我们最终需要输出的是去重复以后的统计结果,所以得在END模块里进行输出
for(i in h)遍历这个数组,i里存的都是房间号
print i,h[i]:输出每一个房间号及其房间里的内容(计数结果)
awk的应用里最重要的一个功能就是计数,而数组在awk里最大的作用就是去重复。