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 /bin6~/bin/{print $1,$6}’ passwd.txt
bin /bin
daemon /sbin
sync /sbin
shutdown /sbin
輸出其中登錄Shell不以nologin結尾(對第7個字段做!~反向匹配)的用戶名、登錄Shell信息:
[root@svr5 ~]# awk -F: ‘7! /nologin7!~/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! /nologin7!~/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 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章