溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

shell腳本編程之正則表達(dá)式(三)(awk、sort、uniq工具)

發(fā)布時(shí)間:2020-06-08 08:17:55 來源:網(wǎng)絡(luò) 閱讀:187 作者:wx5d8a17c45cb5b 欄目:系統(tǒng)運(yùn)維

shell腳本編程之正則表達(dá)式(三)

一、前言

? 前面兩篇文章主要介紹了正則表達(dá)式的概念與作用,對(duì)基礎(chǔ)正則表達(dá)式及擴(kuò)展正則表達(dá)式進(jìn)行概念敘述;同時(shí)介紹了shell“三劍客”中的grep與sed兩個(gè)命令,本文將介紹最后一個(gè)劍客——awk。

? 同時(shí),我們還將介紹sort工具以及uniq工具。

二、awk工具

? 在Linux/Unix系統(tǒng)中,awk是一個(gè)強(qiáng)大的編輯工具,逐行讀取輸入文本,并且根據(jù)指定的匹配模式進(jìn)行查找,對(duì)符合條件的內(nèi)容進(jìn)行格式化輸出或者過濾處理,可以在無交互的情況下實(shí)現(xiàn)相當(dāng)復(fù)雜的文本操作,被廣泛應(yīng)用于 Shell 腳本,完成各種自動(dòng)化配置任務(wù)。

常見用法

? awk 選項(xiàng) ’模式或條件 {編輯指令} ‘ 文件1 文件2

? awk -f 腳本文件 文件1 文件2

? sed命令常用于一整行的處理,awk則是將一行分為多個(gè)字段后再處理,而默認(rèn)情況下字段的分隔符為空格或者TAB鍵。

? awk 執(zhí)行結(jié)果可以通過 print 的功能將字段數(shù)據(jù)打印顯示。在使用 awk 命令的過程中,可以使用邏輯操作符“&&”,表示“與”, “||”表示“或”,“!”表示“非”;還可以進(jìn)行簡單的數(shù)學(xué)運(yùn)算,如+、-、*、/、%、^分別 表示加、減、乘、除、取余和乘方。

? awk包含幾個(gè)特殊的內(nèi)建變量(無法修改但可以直接使用)

? FS:指定每行文本的字段分隔符,默認(rèn)為空格或者制表位(TAB)

? NF:當(dāng)前處理的行的字段個(gè)數(shù)

? NR:當(dāng)前處理的行的行號(hào)(序數(shù))

? $0:當(dāng)前處理的行的內(nèi)容

? $n:當(dāng)前處理行的第n個(gè)字段(第n列)

? FILENAME:被處理的文件名

? RS:數(shù)據(jù)記錄分隔,默認(rèn)為\n 即每行為一條記錄

實(shí)例講述:

1)查找出/etc/passwd文件中的用戶名、用戶ID、組ID列

[root@lokott ~]# awk -F: '{print $1,$3,$4}' /etc/passwd
root 0 0
bin 1 1
daemon 2 2
...//省略部分內(nèi)容
[root@lokott ~]# awk -F: '{print $0}' /etc/passwd  //$0表示顯示整個(gè)行,結(jié)果與cat 和sed -n 'p'等價(jià)
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
......//省略部分內(nèi)容

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的行內(nèi)容,與下等同
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行的內(nèi)容
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ù)行內(nèi)容
     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
    ......//省略部分內(nèi)容
[root@lokott ~]# nl /etc/passwd |awk 'NR%2==0{print}' //輸出偶數(shù)行內(nèi)容
     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結(jié)尾的行
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)計(jì)以/bin/bash結(jié)尾的行的數(shù)量

3)按字段輸出文本

[root@lokott ~]# sed 's/:/ /g' /etc/passwd|awk '{print $1,$3}'|tail -3
named 25
apache 48
lisi 1002
//將passwd文件中的所有:替換為空格后的內(nèi)容到緩存中,然后使用awk命令輸出每行的第一和第三個(gè)字段到管道中,最后輸出最后三行到顯示屏上,也可以在后面繼續(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//輸出第七個(gè)字段中包含/bash的行的第一個(gè)字段
root
lokott
lisi
[root@lokott ~]# awk '($1~"nfs")&&(NF==8){print $1,$2}' /etc/services 
nfs 2049/tcp                            //輸出包含8個(gè)字段且第一個(gè)字段包含nfs的行的第1、2個(gè)字段
nfs 2049/udp
nfs 2049/sctp
netconfsoaphttp 832/tcp
netconfsoaphttp 832/udp
netconfsoapbeep 833/tcp
netconfsoapbeep 833/udp

4)通過管道、雙引號(hào)調(diào)用shell命令

[root@lokott ~]# awk '/bash$/{print |"wc -l"}' /etc/passwd
3
//輸出使用bash的用戶個(gè)數(shù)

三、sort工具和uniq工具

? 在Linux系統(tǒng)中,常用的文件排序工具有三種:sort、uniq、wc。wc在linux命令章節(jié)中講解了,一般用于統(tǒng)計(jì),因此這里不再贅述。主要講解sort和uniq工具的用途和使用方法。

1.sort

? sort是一個(gè)以行為單位對(duì)文件內(nèi)容進(jìn)行排序的工具,也可以根據(jù)不同的數(shù)據(jù)類型來排序。

? 使用格式:sort [選項(xiàng)] 參數(shù)

? 選項(xiàng):

  • -f:忽略大小寫;
  • -b:忽略每行前面的空格;
  • -M:按照月份進(jìn)行排序;
  • -n:按照數(shù)字進(jìn)行排序;
  • -r:反向排序;(常用)
  • -u:等同于 uniq,表示相同的數(shù)據(jù)僅顯示一行;
  • -t:指定分隔符,默認(rèn)使用[Tab]鍵分隔;
  • -o <輸出文件>:將排序后的結(jié)果轉(zhuǎn)存至指定文件;(常用)
  • -k:指定排序區(qū)域。

實(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
     ......//省略部分內(nèi)容
[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
     ......//省略部分內(nèi)容
[root@lokott ~]# sort -t: -k 1 /etc/passwd  //根據(jù):號(hào)將第一列進(jìn)行正向排序
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
......//省略部分內(nèi)容

[root@lokott ~]# sort -t: -k 1 /etc/passwd -o out.txt  //將上述結(jié)果輸入到文件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
......//省略部分內(nèi)容

2.uniq

uniq工具在Linux系統(tǒng)中通常與sort命令結(jié)合使用,用于報(bào)告或者忽略文件中的重復(fù)行。

格式:uniq [選項(xiàng)] 參數(shù)

選項(xiàng):

-c:進(jìn)行計(jì)數(shù)

-d:僅顯示重復(fù)行

-u:僅顯示出現(xiàn)一次的行

實(shí)例:

[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ù)的重復(fù)的行
this is a test

hello

world 

this is a test
list

hostname

[root@lokott ~]#uniq -c test.txt  //行前顯示該行重復(fù)出現(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ù)重復(fù)的重復(fù)行
this is a test
hello

this is a test
list
hostname

四、小結(jié)

? 本文主要講解的是awk、sort以及uniq工具的用途以及使用方法,結(jié)合實(shí)例來解釋。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI