AWK

awk工具

awk工具和sed工具還有grep工具都類似,而awk工具都比前二者功能都要豐富的多。
awk工具強大足以能夠寫一本專門的書,因此這裏就學習平常所需的知識點用於處理平常工做中須要的技巧。bash

截取文檔中的某個段;ide

[root@Ask-02 演示3]# head -n2 test.txt |awk -F ':' '{print $1}'
root
bin工具

這裏,-F選項是指定分隔符。若是不加-F選項,則會以空格或者tab爲分隔符。print爲打印的動做,用來答應某個字段,這裏我選擇打印的是第一段,用$1來表示,固然還有$2$3這些,而$0比較特殊它表明的全部(即整行)
如下示例;post

[root@Ask-02 演示3]# head -n2 test.txt |awk -F ':' '{print $0}'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin學習

這裏-F後面跟單引號,單引號裏面是分隔符。print的動做須要用花括號「{}」括起來,不然會報錯。print還能夠打印自定義的內容,自定義的內容須要用雙引號括起來。
比方說咱們自定義用井號#來左右分隔符隔開段內容;文檔

[root@Ask-02 演示3]# head -n2 test.txt |awk -F ':' '{print $1"#"$2"#"$3"#"}'
root#x#0#
bin#x#1#字符串

匹配字符或者字符串;數學

[root@Ask-02 演示3]# awk '/oo/' test.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
setroubleshoot:x:990:985::/var/lib/setroubleshoot:/sbin/nologinit

這跟sed工具的用法類似,能實現grep的功能但沒有顏色的顯示,這點天然沒有grep方便,不過awk工具要比這兩有着更強大的匹配
如下示例;
[root@Ask-02 演示3]# awk -F ':' '$1 ~/oo/' test.txt
root:x:0:0:root:/root:/bin/bash
setroubleshoot:x:990:985::/var/lib/setroubleshoot:/sbin/nologinclass

能夠看到它已第一段($1)去匹配(oo),不只如此還能夠屢次匹配
如下示例;
[root@Ask-02 演示3]# awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt
root 0
test 3
operator 11

這裏能夠看到awk先匹配root,在匹配test,還能夠只打印所匹配的段。

[root@Ask-02 演示3]# awk -F ':' '$3=="0"' test.txt
root:x:0:0:root:/root:/bin/bash

awk工具能夠用邏輯符號進行判斷,好比==就是等於,也能夠理解爲精確匹配。另外還有>、>=、<、<=等。在和數字比較時,若把比較的數字用雙引號引發來,那麼awk不會認爲是數字,而會認爲是字符,不加雙引號則會認爲是數字。
如下示例;

[root@Ask-02 演示3]# awk -F ':' '$3>="500"' test.txt
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

這一示例中我本意是想把第三段數值大於500的匹配打印出來,但並無成功,這是應爲我加上了雙引號,awk把全部的數字看成了字符,這是隻要不加雙引號便可;

[root@Ask-02 演示3]# awk -F ':' '$3>=500' test.txt
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin

除了針對某一段的字符進行邏輯比較外,還能夠在兩段之間進行邏輯比較;

[root@Ask-02 演示3]# awk -F ':' '$3<$4' test.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
test:x:3:6:kajds:aksjdk:lkj/asd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

使用&&||,分別表示「而且」和「或者」
如下示例;

[root@Ask-02 演示3]# awk -F ':' '$3<"$5" && $3<"$7"' test.txt
或者
[root@Ask-02 演示3]# awk -F ':' '$3>1000 || $3=="/bin/bash"' test.txt
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

awk的內置變量
awk的經常使用變量有OFSNFNROFS-F選項有相似的功能,也是用來定義分隔符的,可是他是在輸出的時候定義,NF表示用分隔符分隔後一共有多少段,NR表示行號。

OFS示例;

[root@Ask-02 演示3]# head -5 test.txt |awk -F ':' '{OFS="#"}{print $1,$3,$4}'
root#0#0
bin#1#1
daemon#2#2
adm#3#4
lp#4#7

以及更高級一些的用法;

[root@Ask-02 演示3]# awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' test.txt
nfsnobody#x#65534#65534

NF示例;

[root@Ask-02 演示3]# head -n3 test.txt | awk -F ':' '{print NF}' //NF表示多少段
7
7
7

NR示例;

[root@Ask-02 演示3]# head -n3 test.txt | awk -F ':' '{print NR}'
1
2
3

還可使用NR作爲判斷條件;

[root@Ask-02 演示3]# awk 'NR>40' test.txt
setroubleshoot:x:990:985::/var/lib/setroubleshoot:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin
ask:x:1000:1000:Ask:/home/ask:/bin/bash

也能夠配合段匹配使用;

[root@Ask-02 演示3]# awk -F ':' 'NR<20 && $1 ~ /root/' test.txt
root:x:0:0:root:/root:/bin/bash

awk中的數學運算

awk更改段值;

[root@Ask-02 演示3]# head -n 3 test.txt |awk -F ':' '$1="root"'
root x 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin
root x 2 2 daemon /sbin /sbin/nologin

awk能夠對各個段的值進行數學運算;

[root@Ask-02 演示3]# head -n2 test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@Ask-02 演示3]# head -n2 test.txt |awk -F ':' '{$7=$3+$4; print $0}'
root x 0 0 root /root 0
bin x 1 1 bin /bin 2

awk計算某個段的總格;

[root@Ask-02 演示3]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt
79232

這裏END是awk特有的語法,表示全部的行都已經執行。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息