Linux之awk 练习题-包含对应练习题和答案
1.在/etc/shadow文件中,如果第二字段为!!则输出该行,如果为*则输出第一字段,都不是则输出第五字段。
[root@ecs-76840553 home]# cat /etc/shadow root:$6$lf0cF9//$UviefiOX27j6s67Lnc2s23j7N1Gz0AdiNZl7P3XPWwNUV2sQjLDgpAjuWt9QMwoYJT4egrv0niLH0TE39Pnm40:19235:0:99999:7::: bin:*:17988:0:99999:7::: daemon:*:17988:0:99999:7::: adm:!*:17988:0:99999:7::: lp:!*:17988:0:99999:7::: sync:!*:17988:0:99999:7::: shutdown:!*:17988:0:99999:7::: halt:!*:17988:0:99999:7::: mail:*:17988:0:99999:7::: operator:!*:17988:0:99999:7::: games:!*:17988:0:99999:7::: ftp:*:17988:0:99999:7::: nobody:!*:17988:0:99999:7::: dbus:!!:18250:::::: systemd-coredump:!!:18250:::::: systemd-resolve:!!:18250:::::: tss:!!:18250:::::: polkitd:!!:18250:::::: unbound:!!:18250:::::: sssd:!!:18250:::::: sshd:!!:18250:::::: tcpdump:!!:18250:::::: [root@ecs-76840553 home]# cat /etc/shadow | awk -F ":" '{if($2 == "!!"){print "!!所在行:"$0}else if($2 == "*"){print "*所在行:"$1}else{print "其它条件所在行:"$5}}' 其它条件所在行:99999 *所在行:bin *所在行:daemon 其它条件所在行:99999 其它条件所在行:99999 其它条件所在行:99999 其它条件所在行:99999 其它条件所在行:99999 *所在行:mail 其它条件所在行:99999 其它条件所在行:99999 *所在行:ftp 其它条件所在行:99999 !!所在行:dbus:!!:18250:::::: !!所在行:systemd-coredump:!!:18250:::::: !!所在行:systemd-resolve:!!:18250:::::: !!所在行:tss:!!:18250:::::: !!所在行:polkitd:!!:18250:::::: !!所在行:unbound:!!:18250:::::: !!所在行:sssd:!!:18250:::::: !!所在行:sshd:!!:18250:::::: !!所在行:tcpdump:!!:18250:::::: [root@ecs-76840553 home]#
2.获取本机eth0网卡IP.
[root@ecs-76840553 home]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.0.4 netmask 255.255.255.0 broadcast 192.168.0.255 inet6 fe80::8471:3140:ce7f:8f3b prefixlen 64 scopeid 0x20<link> ether fa:16:3e:0d:3d:f1 txqueuelen 1000 (Ethernet) RX packets 191500 bytes 16091360 (15.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 298512 bytes 51483043 (49.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 18 bytes 1238 (1.2 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 18 bytes 1238 (1.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@ecs-76840553 home]# ifconfig | grep inet | awk 'NR==1{print $2}' 192.168.0.4 [root@ecs-76840553 home]#
3. 在/etc/passwd 中,打印获取到的UID小于100的值?
[root@ecs-76840553 home]# cat /etc/passwd | awk -F ":" '{if($3<100){print $0}}' root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/bin/false lp:x:4:7:lp:/var/spool/lpd:/bin/false sync:x:5:0:sync:/sbin:/bin/false shutdown:x:6:0:shutdown:/sbin:/bin/false halt:x:7:0:halt:/sbin:/bin/false mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/bin/false games:x:12:100:games:/usr/games:/bin/false ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin [root@ecs-76840553 home]#
4.过滤掉下面文本konge.txt空行。
[root@localhost home]# cat konge.txt
AAA
BBB
CCC
DDD
[root@localhost home]#
过滤如下:
[root@localhost home]# awk '!/^[[:blank:]]*$/{print $0}' konge.txt AAA BBB CCC DDD [root@localhost home]# awk '!/^ *$/{print $0}' konge.txt AAA BBB CCC DDD [root@localhost home]#
说明:/^$/
是一个正则表达式,功能是匹配文本中的空白行。[:blank:] :所有水平空格 以^ $ 书写是组成一个空行
5. 统计日志文件xxx.log每个shopId出现的错误的次数.
5.1 xxx.log 内容
[root@ecs-76840553 home]# cat xxx.log 00:09:07.655 [showcase_backend][ShowcaseServiceImpl] WARN - showcase add recommend from taobao failed |shopId=1482502318|itemId=548320850657||530|Remote service error|isv.item-recommend-service-error:SAVE_REQUEST_TOO_MANY_TIMES| 00:09:07.673 [showcase_backend][topsdk] ERROR - 2017-06-27 00:09:07.673^_^xxxxxxx^_^taobao.item.recommend.add^_^10.28.42.60^_^Linux^_^18^_^http://gwx.api.taobao.com/router/rest^_^app_key=xxxxx&partner_id=top-sdk-java-20170607&method=taobao.item.recommend.add&v=2.0&session=xxxxxxxx&format=json&sign_method=hmac&num_iid=5483473847602×tamp=2017-06-27+00%3A09%3A07^_^{"error_response":{"code":530,"msg":"Remote service error","sub_code":"isv.item-recommend-service-error:SAVE_REQUEST_TOO_MANY_TIMES","sub_msg":"橱窗推荐商品失败","request_id":"qm4l3wu2cnhu"}} 00:09:07.673 [showcase_backend][ShowcaseServiceImpl] WARN - showcase add recommend from taobao failed |shopId=14825032138|itemId=548347847602||530|Remote service error|isv.item-recommend-service-error:SAVE_REQUEST_TOO_MANY_TIMES| 00:09:07.695 [showcase_backend][ShowcaseServiceImpl] WARN - showcase add recommend from taobao failed |shopId=148250232138|itemId=546199835284||530|Remote service error|isv.item-recommend-service-error:SAVE_REQUEST_TOO_MANY_TIMES|橱
5.2 统计日志文件xxx.log每个shopId出现的错误的次数.
[root@ecs-76840553 home]# cat xxx.log | grep shopId | awk -F "|" '{print $2}'| awk -F "=" '{s[$2]+=1}END{for(i in s){print i,s[i]}}' 14825032138 1 148250232138 1 1482502318 1 [root@ecs-76840553 home]# cat xxx.log | grep shopId | awk -F "|" '{print $2}'|awk -F "=" '{print $2}'|sort | uniq -c 1 1482502318 1 148250232138 1 14825032138 [root@ecs-76840553 home]#
解释:是s[$2] 把第二列数据存储到数组s中,s[$2] +=1 有的加1,相同的就相累加
6 在每个 start与end块内,查询第一次出现的 i hate you 行。
[root@ecs-76840553 myawk]# cat 1.txt hate you 1 start 1 i love you i hate you 2 i hate you3 end 1 start 2 i love you i hate you 22 i hate you 4 end 2 start 2 i love you i hate you 33 i hate you 4 end 2 start 2 i love you i hate you 44 i hate you 4 end 2 [root@ecs-76840553 myawk]#
执行如下:
[root@ecs-76840553 myawk]# awk '{{if ($0 ~ /^start/ ) { start=1; i= 0; next }else if ($0 ~ /^end/ ) { start = 0; next }else if (start) {if ($0 ~ /i hate you/ ) hate[++i] = $0 }if (i==1) print hate[i]}}' 1.txt i hate you 2 i hate you 22 i hate you 33 i hate you 44
注意点: 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
next :不再执行后面的语句,转而直接读下行。
题6讲解: 执行过程:
执行过程: 行1 hate you 1 : 行1内容执行pattern语句块,无匹配执行的内容,不发生任何变化。 行2 start 1: 匹配if ($0 ~ /^start/ ) { start=1; i= 0; next } 执行 ;next 不读后面的语句块,直接读下一行。 行3 i love you 由行2已得局部变量 start=1; i= 0;,匹配else if (start) {if ($0 ~ /i hate you/ ) hate[++i] = $0 }执行,符合start条件 执行,里面if条件不匹配不执行 行4 i hate you 由行2已得局部变量 start=1; i= 0;匹配else if (start) {if ($0 ~ /i hate you/ ) hate[++i] = $0 }执行 全部匹配 输出 i=1 行5 i hate you 由行2,4已得局部变量 start=1; i= 1;匹配else if (start) {if ($0 ~ /i hate you/ ) hate[++i] = $0 }执行 全部匹配 输出 i=2 行6 end :else if (/^end/) {start = 0; print start;next } 执行完,next不读后面语句块,直接读下一行。 重新循环
7.找出含有2的行。
[root@ecs-76840553 myawk]# cat 2.txt 111 121 333 234 444 552 234 555 626 [root@ecs-76840553 myawk]#
解决:
[root@ecs-76840553 myawk]# awk '{i=0;if(/2/){s[++i]=$0} print s[i]}' 2.txt | awk '!/^ *$/{print $1}' 121 234 552 234 626 [root@ecs-76840553 myawk]# awk '/2/{print $0}' 2.txt 121 234 552 234 626
[root@ecs-76840553 myawk]# awk '{i=0;/2/ && array[++i]=$0;if(i==1){print array[i]}}' 2.txt
121
234
552
234
626
8.统计机器中网络连接各个状态个数.
方法1:
[root@VM-4-13-centos awk]# netstat -a | awk '/^tcp/ { ++S[$NF]}END{for(b in S) print b,S[b]}' LISTEN 8 ESTABLISHED 4 TIME_WAIT 1
方法2:
[root@VM-4-13-centos awk]# netstat -a |grep tcp|awk '{print $6}'|sort |uniq -c 4 ESTABLISHED 8 LISTEN 1 TIME_WAIT
9.如何使用awk查询指定的字符。
10.10.49.100 10.10.49.101 10.10.49.100 10.10.49.102 10.10.49.101 10.12.49.100
解答:
[root@VM-4-13-centos awk]# cat ip.txt | awk '/10.10.49.101/{print $0}' 10.10.49.101 10.10.49.101