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&timestamp=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

 

posted @ 2022-09-01 10:02  家乐福的搬砖日常  阅读(448)  评论(0编辑  收藏  举报