? 前面兩篇文章主要介紹了正則表達式的概念與作用,對基礎正則表達式及擴展正則表達式進行概念敘述;同時介紹了shell“三劍客”中的grep與sed兩個命令,本文將介紹最后一個劍客——awk。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名與空間、網站空間、營銷軟件、網站建設、荔浦網站維護、網站推廣。
? 同時,我們還將介紹sort工具以及uniq工具。
? 在Linux/Unix系統(tǒng)中,awk是一個強大的編輯工具,逐行讀取輸入文本,并且根據(jù)指定的匹配模式進行查找,對符合條件的內容進行格式化輸出或者過濾處理,可以在無交互的情況下實現(xiàn)相當復雜的文本操作,被廣泛應用于 Shell 腳本,完成各種自動化配置任務。
? awk 選項 ’模式或條件 {編輯指令} ‘ 文件1 文件2
? awk -f 腳本文件 文件1 文件2
? sed命令常用于一整行的處理,awk則是將一行分為多個字段后再處理,而默認情況下字段的分隔符為空格或者TAB鍵。
? awk 執(zhí)行結果可以通過 print 的功能將字段數(shù)據(jù)打印顯示。在使用 awk 命令的過程中,可以使用邏輯操作符“&&”,表示“與”, “||”表示“或”,“!”表示“非”;還可以進行簡單的數(shù)學運算,如+、-、*、/、%、^分別 表示加、減、乘、除、取余和乘方。
? awk包含幾個特殊的內建變量(無法修改但可以直接使用)
? FS:指定每行文本的字段分隔符,默認為空格或者制表位(TAB)
? NF:當前處理的行的字段個數(shù)
? NR:當前處理的行的行號(序數(shù))
? $0:當前處理的行的內容
? $n:當前處理行的第n個字段(第n列)
? FILENAME:被處理的文件名
? RS:數(shù)據(jù)記錄分隔,默認為\n 即每行為一條記錄
實例講述:
1)查找出/etc/passwd文件中的用戶名、用戶ID、組ID列
[root@lokott ~]# awk -F: '{print $1,$3,$4}' /etc/passwd
root 0 0
bin 1 1
daemon 2 2
...//省略部分內容
[root@lokott ~]# awk -F: '{print $0}' /etc/passwd //$0表示顯示整個行,結果與cat 和sed -n 'p'等價
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
......//省略部分內容
2)按行輸出文本
[root@lokott ~]# awk '{print}' /etc/passwd //等同于 awk '{print $0}' /etc/passwd
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
[root@lokott ~]# awk 'NR==1,NR==3{print}' /etc/passwd //輸出1-3的行內容,與下等同
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@lokott ~]# awk '(NR>=1)&&(NR<=3){print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@lokott ~]# awk '(NR==1)||(NR==3){print}' /etc/passwd //輸出第1和3行的內容
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@lokott ~]# nl /etc/passwd |awk 'NR%2==1{print}' //輸出奇數(shù)行內容
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
......//省略部分內容
[root@lokott ~]# nl /etc/passwd |awk 'NR%2==0{print}' //輸出偶數(shù)行內容
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
8 halt:x:7:0:halt:/sbin:/sbin/halt
[root@lokott ~]# awk '/^root/{print}' /etc/passwd //輸出以root開頭的行
root:x:0:0:root:/root:/bin/bash
[root@lokott ~]# awk '/bash$/{print}' /etc/passwd //輸出以bash結尾的行
root:x:0:0:root:/root:/bin/bash
lokott:x:1000:1000:lokott:/home/lokott:/bin/bash
lisi:x:1002:1002::/home/lisi:/bin/bash
[root@lokott ~]# awk 'BEGIN{x=0};/\/bin\/bash$/ {x++};END {print x}' /etc/passwd
3
[root@lokott ~]# grep -c "/bin/bash$" /etc/passwd
3
//統(tǒng)計以/bin/bash結尾的行的數(shù)量
3)按字段輸出文本
[root@lokott ~]# sed 's/:/ /g' /etc/passwd|awk '{print $1,$3}'|tail -3
named 25
apache 48
lisi 1002
//將passwd文件中的所有:替換為空格后的內容到緩存中,然后使用awk命令輸出每行的第一和第三個字段到管道中,最后輸出最后三行到顯示屏上,也可以在后面繼續(xù)添加“|sort”繼續(xù)排序
[root@lokott ~]# awk -F: '$2=="!!"{print}' /etc/shadow |tail -3
tcpdump:!!:18214::::::
named:!!:18220::::::
apache:!!:18228::::::
//輸出密碼為?。。]有密碼的)的用戶的shadow記錄
[root@lokott ~]# awk -F: '$7~"/bash"{print $1}' /etc/passwd//輸出第七個字段中包含/bash的行的第一個字段
root
lokott
lisi
[root@lokott ~]# awk '($1~"nfs")&&(NF==8){print $1,$2}' /etc/services
nfs 2049/tcp //輸出包含8個字段且第一個字段包含nfs的行的第1、2個字段
nfs 2049/udp
nfs 2049/sctp
netconfsoaphttp 832/tcp
netconfsoaphttp 832/udp
netconfsoapbeep 833/tcp
netconfsoapbeep 833/udp
4)通過管道、雙引號調用shell命令
[root@lokott ~]# awk '/bash$/{print |"wc -l"}' /etc/passwd
3
//輸出使用bash的用戶個數(shù)
? 在Linux系統(tǒng)中,常用的文件排序工具有三種:sort、uniq、wc。wc在linux命令章節(jié)中講解了,一般用于統(tǒng)計,因此這里不再贅述。主要講解sort和uniq工具的用途和使用方法。
? sort是一個以行為單位對文件內容進行排序的工具,也可以根據(jù)不同的數(shù)據(jù)類型來排序。
? 使用格式:sort [選項] 參數(shù)
? 選項:
實例:
[root@lokott ~]# sort /etc/passwd |nl //依據(jù)字母排序正向
1 abrt:x:173:173::/etc/abrt:/sbin/nologin
2 adm:x:3:4:adm:/var/adm:/sbin/nologin
3 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
4 avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
5 bin:x:1:1:bin:/bin:/sbin/nologin
......//省略部分內容
[root@lokott ~]# sort -r /etc/passwd |nl //依據(jù)字母排序反向
1 usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
2 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
3 tcpdump:x:72:72::/:/sbin/nologin
4 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
5 sync:x:5:0:sync:/sbin:/bin/sync
......//省略部分內容
[root@lokott ~]# sort -t: -k 1 /etc/passwd //根據(jù):號將第一列進行正向排序
abrt:x:173:173::/etc/abrt:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:995:991::/var/lib/chrony:/sbin/nologin
colord:x:997:995:User for colord:/var/lib/colord:/sbin/nologin
......//省略部分內容
[root@lokott ~]# sort -t: -k 1 /etc/passwd -o out.txt //將上述結果輸入到文件out.txt中
[root@lokott ~]# cat out.txt
abrt:x:173:173::/etc/abrt:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
......//省略部分內容
uniq工具在Linux系統(tǒng)中通常與sort命令結合使用,用于報告或者忽略文件中的重復行。
格式:uniq [選項] 參數(shù)
選項:
-c:進行計數(shù)
-d:僅顯示重復行
-u:僅顯示出現(xiàn)一次的行
實例:
[root@lokott ~]# cat test.txt //有空行
this is a test
this is a test
this is a test
hello
hello
world
this is a test
this is a test
list
list
hostname
hostname
[root@lokott ~]# uniq test.txt //刪除互相連續(xù)的重復的行
this is a test
hello
world
this is a test
list
hostname
[root@lokott ~]#uniq -c test.txt //行前顯示該行重復出現(xiàn)的此次數(shù)
3 this is a test
1
2 hello
1
1 world
2
2 this is a test
2 list
1
2 hostname
1
[root@lokott ~]# uniq -d test.txt //刪除連續(xù)重復的重復行
this is a test
hello
this is a test
list
hostname
? 本文主要講解的是awk、sort以及uniq工具的用途以及使用方法,結合實例來解釋。