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记录知识小结:

  1. NR存放着每个记录的号(行号)读取新行时候会自动+1
  2. RS是输入数据的记录的分隔符,简单理解就是可以指定每个记录的结尾标志。
  3. RS作用就是表示一个记录的结束
  4. 当我们修改了RS的值,最好配合NR(行)来查看变化,也就是修改了RS的值通过NR查看结果,调试awk程序。
  5. 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

    1. i替换成h[$2];相当于我创建了一个数组h[],然后用$2作为我的房间号。但是目前房间里是没有东西的。也就是说h[$2]=h["www.etiantian.org"] and h["post.etiantian.org"] and h["mp3.etiantian.org"] 但是具体房间里是没有东西的也就是空。
    2. h[$2]++就等于i++:也就是说我开始给房间里加东西;当出现同样的东西,我就++
    3. print h["www.etiantian.org"]:意思就是说我开始要输出了。我要输出的是房间号为“www.etiantian.org”里面的内容。这里面的内容最早是空的,随着awk读取每一行一旦出现房间号为“www.etiantian.org”的房间时,我就给房间里的内容进行++。
    4. 综上,输出的结果中,每次出现www.etiantian.org时,h["www.etiantian.org"]就会++。因此最后的输出数字是3

  输出最终计数结果:awk -F "[/]+" '{h[$2]++}END{for(i in h)print i,h[i]}' file

    1. 我们最终需要输出的是去重复以后的统计结果,所以得在END模块里进行输出
    2. fori in h)遍历这个数组,i里存的都是房间号
    3. print ih[i]:输出每一个房间号及其房间里的内容(计数结果)

awk的应用里最重要的一个功能就是计数,而数组在awk里最大的作用就是去重复。

posted @ 2018-11-23 20:24  mashuang  阅读(227)  评论(0编辑  收藏  举报