LINUX 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: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:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

1)使用正则表达式设置条件
输出其中以bash结尾的完整记录:

[root@svr5 ~]# awk -F: '/bash$/{print}' passwd.txt
root:x:0:0:root:/root:/bin/bash

输出以a、b、c或d开头的用户名、宿主目录:

[root@svr5 ~]# awk -F: '/^[a-d]/{print $1,$6}' passwd.txt
bin /bin
daemon /sbin
adm /var/adm

输出其中用户名以a开头、登录Shell以nologin结尾的用户名、登录Shell:

[root@svr5 ~]# awk -F: '/^a|nologin$/{print $1,$7}' passwd.txt
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin

输出其中宿主目录以bin结尾(对第6个字段做~匹配)的用户名、宿主目录信息:

[root@svr5 ~]# awk -F: '$6~/bin$/{print $1,$6}' passwd.txt
bin /bin
daemon /sbin
sync /sbin
shutdown /sbin

输出其中登录Shell不以nologin结尾(对第7个字段做!~反向匹配)的用户名、登录Shell信息:

[root@svr5 ~]# awk -F: '$7!~/nologin$/{print $1,$7}' passwd.txt
root /bin/bash
sync /bin/sync
shutdown /sbin/shutdown

2)使用数值/字符串比较设置条件
输出第3行(行号NR等于3)的用户记录:

[root@svr5 ~]# awk -F: 'NR==3{print}' passwd.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin

输出奇数行(行号NR除以2余数为1)的用户记录:

[root@svr5 ~]# awk -F: 'NR%2==1{print}' passwd.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

输出偶数行(行号NR除以2余数为0)的用户记录:

[root@svr5 ~]# awk -F: 'NR%2==0{print}' passwd.txt
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

输出前3行文本:

[root@svr5 ~]# awk -F: 'NR<=3{print}' passwd.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

输出从第5行开始到文件末尾的所有行:

[root@svr5 ~]# awk -F: 'NR>=5{print}' passwd.txt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

输出用户名为“sync”的行:

[root@svr5 ~]# awk -F: '$1=="sync"{print}' passwd.txt
sync:x:5:0:sync:/sbin:/bin/sync

输出当前用户的用户名、宿主目录、登录Shell信息:

[root@svr5 ~]# awk -F: '$1==ENVIRON["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:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

严谨一点可以写成:

[root@svr5 ~]# awk -F: '(NR>=3)&&(NR<=5){print}' passwd.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

输出第3行和第5行文本:

[root@svr5 ~]# awk -F: 'NR==3||NR==5{print}' passwd.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

输出“登录Shell不以nologin结尾”或者“用户名以a或d开头”的文本:

[root@svr5 ~]# awk -F: '$7!~/nologin$/||$1~/^[ad]/{print}' passwd.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

输出UID小于3或者UID是偶数的用户记录:

[root@svr5 ~]# awk -F: '$3<3||$3%2==0{print}' passwd.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x: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:x:501:501::/home/hunter:/bin/bash
vina:x:502:502::/home/vina:/bin/bash
kdev:x:503:503::/home/kdev:/bin/bash
zengye:x:504:504::/home/zengye:/bin/bash
stu01:x: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%7==0||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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值