您好,登錄后才能下訂單哦!
? 前面兩篇文章主要介紹了正則表達式的概念與作用,對基礎正則表達式及擴展正則表達式進行概念敘述;同時介紹了shell“三劍客”中的grep與sed兩個命令,本文將介紹最后一個劍客——awk。
? 同時,我們還將介紹sort工具以及uniq工具。
? 在Linux/Unix系統中,awk是一個強大的編輯工具,逐行讀取輸入文本,并且根據指定的匹配模式進行查找,對符合條件的內容進行格式化輸出或者過濾處理,可以在無交互的情況下實現相當復雜的文本操作,被廣泛應用于 Shell 腳本,完成各種自動化配置任務。
? awk 選項 ’模式或條件 {編輯指令} ‘ 文件1 文件2
? awk -f 腳本文件 文件1 文件2
? sed命令常用于一整行的處理,awk則是將一行分為多個字段后再處理,而默認情況下字段的分隔符為空格或者TAB鍵。
? awk 執行結果可以通過 print 的功能將字段數據打印顯示。在使用 awk 命令的過程中,可以使用邏輯操作符“&&”,表示“與”, “||”表示“或”,“!”表示“非”;還可以進行簡單的數學運算,如+、-、*、/、%、^分別 表示加、減、乘、除、取余和乘方。
? awk包含幾個特殊的內建變量(無法修改但可以直接使用)
? FS:指定每行文本的字段分隔符,默認為空格或者制表位(TAB)
? NF:當前處理的行的字段個數
? NR:當前處理的行的行號(序數)
? $0:當前處理的行的內容
? $n:當前處理行的第n個字段(第n列)
? FILENAME:被處理的文件名
? RS:數據記錄分隔,默認為\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}' //輸出奇數行內容
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}' //輸出偶數行內容
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
//統計以/bin/bash結尾的行的數量
3)按字段輸出文本
[root@lokott ~]# sed 's/:/ /g' /etc/passwd|awk '{print $1,$3}'|tail -3
named 25
apache 48
lisi 1002
//將passwd文件中的所有:替換為空格后的內容到緩存中,然后使用awk命令輸出每行的第一和第三個字段到管道中,最后輸出最后三行到顯示屏上,也可以在后面繼續添加“|sort”繼續排序
[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的用戶個數
? 在Linux系統中,常用的文件排序工具有三種:sort、uniq、wc。wc在linux命令章節中講解了,一般用于統計,因此這里不再贅述。主要講解sort和uniq工具的用途和使用方法。
? sort是一個以行為單位對文件內容進行排序的工具,也可以根據不同的數據類型來排序。
? 使用格式:sort [選項] 參數
? 選項:
實例:
[root@lokott ~]# sort /etc/passwd |nl //依據字母排序正向
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 //依據字母排序反向
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 //根據:號將第一列進行正向排序
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系統中通常與sort命令結合使用,用于報告或者忽略文件中的重復行。
格式:uniq [選項] 參數
選項:
-c:進行計數
-d:僅顯示重復行
-u:僅顯示出現一次的行
實例:
[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 //刪除互相連續的重復的行
this is a test
hello
world
this is a test
list
hostname
[root@lokott ~]#uniq -c test.txt //行前顯示該行重復出現的此次數
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 //刪除連續重復的重復行
this is a test
hello
this is a test
list
hostname
? 本文主要講解的是awk、sort以及uniq工具的用途以及使用方法,結合實例來解釋。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。