shell awk处理条件

2.awk处理条件
问题
本案例要求使用awk工具完成下列过滤任务,注意awk处理条件的设置:
列出UID间于501~505的用户详细信息
输出/etc/hosts文件内以127或192开头的记录
列出100以内整数中7的倍数或是含7的数
步骤
实现此案例需要按照如下步骤进行。
步骤一:认识awk处理条件的设置
创建测试文件passwd.txt文件:
[root@svr5 ~]# head -7 /etc/passwd > passwd.txt
[root@svr5 ~]# cat passwd.txt
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
sync❌5:0:sync:/sbin:/bin/sync
shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
1)使用正则表达式设置条件
输出其中以bash结尾的完整记录:
[root@svr5 ~]# awk -F: ‘/bash$/{print}’ passwd.txt
root❌0:0:root:/root:/bin/bash
输出以a、b、c或d开头的用户名、宿主目录:
[root@svr5 ~]# awk -F: ‘/1/{print $1,KaTeX parse error: Expected 'EOF', got '}' at position 2: 6}̲' passwd.txt bi…/{print $1,$7}’ passwd.txt
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
输出其中宿主目录以bin结尾(对第6个字段做~匹配)的用户名、宿主目录信息:
[root@svr5 ~]# awk -F: ‘ 6   / b i n 6~/bin /{print $1,$6}’ passwd.txt
bin /bin
daemon /sbin
sync /sbin
shutdown /sbin
输出其中登录Shell不以nologin结尾(对第7个字段做!~反向匹配)的用户名、登录Shell信息:
[root@svr5 ~]# awk -F: ‘ 7 !   / n o l o g i n 7!~/nologin /{print $1,$7}’ passwd.txt
root /bin/bash
sync /bin/sync
shutdown /sbin/shutdown
2)使用数值/字符串比较设置条件
输出第3行(行号NR等于3)的用户记录:
[root@svr5 ~]# awk -F: ‘NR3{print}’ passwd.txt
daemon❌2:2:daemon:/sbin:/sbin/nologin
输出奇数行(行号NR除以2余数为1)的用户记录:
[root@svr5 ~]# awk -F: 'NR%2
1{print}’ passwd.txt
root❌0:0:root:/root:/bin/bash
daemon❌2:2:daemon:/sbin:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
输出偶数行(行号NR除以2余数为0)的用户记录:
[root@svr5 ~]# awk -F: ‘NR%20{print}’ passwd.txt
bin❌1:1:bin:/bin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
sync❌5:0:sync:/sbin:/bin/sync
输出前3行文本:
[root@svr5 ~]# awk -F: ‘NR<=3{print}’ passwd.txt
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
输出从第5行开始到文件末尾的所有行:
[root@svr5 ~]# awk -F: ‘NR>=5{print}’ passwd.txt
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
sync❌5:0:sync:/sbin:/bin/sync
shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
输出用户名为“sync”的行:
[root@svr5 ~]# awk -F: '$1
"sync"{print}’ passwd.txt
sync❌5:0:sync:/sbin:/bin/sync
输出当前用户的用户名、宿主目录、登录Shell信息:
[root@svr5 ~]# awk -F: ‘$1ENVIRON[“USER”]{print $1,$6,$7}’ passwd.txt
root /root /bin/bash
3)逻辑测试条件
输出第3~5行文本:
[root@svr5 ~]# awk -F: ‘NR>=3&&NR<=5{print}’ passwd.txt
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
严谨一点可以写成:
[root@svr5 ~]# awk -F: ‘(NR>=3)&&(NR<=5){print}’ passwd.txt
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
输出第3行和第5行文本:
[root@svr5 ~]# awk -F: 'NR
3||NR5{print}’ passwd.txt
daemon❌2:2:daemon:/sbin:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
输出“登录Shell不以nologin结尾”或者“用户名以a或d开头”的文本:
[root@svr5 ~]# awk -F: ‘ 7 !   / n o l o g i n 7!~/nologin /||$1~/2/{print}’ passwd.txt
root❌0:0:root:/root:/bin/bash
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
sync❌5:0:sync:/sbin:/bin/sync
shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
输出UID小于3或者UID是偶数的用户记录:
[root@svr5 ~]# awk -F: '$3<3||$3%2
0{print}’ passwd.txt
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
4)数学运算
以统计passwd.txt文件中以“:”分隔的总字段个数,需要每处理一行时将当前行的字段数(内置变量NF)计和,因此可在BEGIN时定义一个初始变量,过程称求和,最后在END时输出结果。
相关操作及结果如下(共49个字段):
[root@svr5 ~]# awk -F: ‘BEGIN{x=0}
{x+=NF} END{print “Total “x” fields.”}’ passwd.txt
Total 49 fields.
步骤二:完成任务要求的awk过滤操作
1)列出UID间于501~505的用户详细信息:
[root@svr5 ~]# awk -F: ‘$3>=501&&$3<=505{print}’ /etc/passwd
hunter❌501:501::/home/hunter:/bin/bash
vina❌502:502::/home/vina:/bin/bash
kdev❌503:503::/home/kdev:/bin/bash
zengye❌504:504::/home/zengye:/bin/bash
stu01❌505:1201::/tech/nsdhome/stu01:/bin/bash
2)输出/etc/hosts映射文件内以127或者192开头的记录:
[root@svr5 ~]# awk -F: ‘/127|192/{print}’ /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.4.5 svr5.tarena.com svr5
3)列出100以内整数中7的倍数或是含7的数:
此操作无处理文件,正常思路应该是用Shell循环来完成;因为要求用awk来实现,如果不用循环,则根据逐行处理的思路,应该提供一个100行的文本对象,然后将行号作为处理的整数,逐个判断并输出即可。
利用seq命令可生成1-100的整数序列,比如:
[root@svr5 ~]# seq 100
1
2
3
4
5
6
7
8
9
10
… …
91
92
93
94
95
96
97
98
99
100
结合管道交给awk处理,可以简化实现步骤。针对本任务而言,行号与每行的实际文本值是一致的,那么根据NR或者$0行值进行判断都是可以的。输出100以内7的倍数或是包含7的数:
[root@svr5 ~]# seq 100 | awk ‘NR%70||NR~/7/{print}’
7
14
17
21
27
28
35
37
42
47
… …
75
76
77
78
79
84
87
91
97
98
或者:
[root@svr5 ~]# seq 100 | awk '$0%7
0||$0~/7/{print}’
7
14
17
21
27
28
35
37
42
47
… …
75
76
77
78
79
84
87
91
97
98


  1. a-d ↩︎

  2. ad ↩︎

发布了121 篇原创文章 · 获赞 69 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/iT__SuperMan/article/details/90746415