awk

awk 工具的使用

awk:針對文檔中的行來操做,一行一行地執行。linux

截取文檔中的某個段**

示例:
[root@jinkai01 sed]# head -n2 passwd | awk -F ':' '{print $1}'
roto
binbash

-F選項的做用是指定分隔符。若是不加-F選項,則以空格或者tab爲分隔符。print爲打印的動做,用來打印某個字段。
$1爲第1個字段,$2爲第2個字段,以此類推。但$0比較特殊,它表示整行:
ide

[root@jinkai01 sed]# head -n2 passwd | awk -F ':' '{print $0}'
roto:x:0:0:roto:/roto:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin工具

1,匹配字符或者字符串
打印出passwd 文件中包含 oo 的行文檔

[root@jinkai01 awk]# awk '/oo/' passwd字符串

打印出passwd 文檔中以:爲分隔符的第一列包含有oo 的行數學

[root@jinkai01 awk]# awk -F ':' '$1 ~ /oo/' passwd
root:x:0:0:root:/root:/bin/bashit

2,還能夠一次性匹配多個字符串
打印出passwd 文檔中以:爲分隔符包含root或user的第一列和第三列class

[root@jinkai01 awk]# awk -F ':' '/root/ {print $1,$3} /user/ {print $1,$3}' passwdtest

條件操做符

awk中能夠用邏輯符號進行判斷,好比==就是等於,也能夠理解爲精確匹配。另外還有>、>=、<、<=、!=等。
值得注意的是,在和數字比較時,若把比較的數字用雙引號引發來,那麼awk不會認爲是數字,而會認爲是字符,按照ACSII進行比較;不加雙引號則會認爲是數字,按照數字大小比較;

[root@jinkai01 awk]# awk -F ':' '$3>=500' passwd
[root@jinkai01 awk]# awk -F ':' '$3>=500' passwd
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
linuxprobe:x:1000:1000:linuxprobe:/home/linuxprobe:/bin/bash

加雙引號,以ACSII碼值進行比較

[root@jinkai01 awk]# awk -F ':' '$3>="500"' passwd
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

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

打印出passwd 文檔中 第三列數值小於第四列

[root@jinkai01 awk]# awk -F ':' '$3<$4' passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

另外還可使用&&和||,它們分別表示「而且」和「或者」。
打印出passwd 文檔中第三列數值小於7大於5的行

[root@jinkai01 awk]# awk -F ':' '$3>5 && $3<7' passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

打印出passwd 文檔中第三列大於1000 或者第七列是/bin/bash的行

[root@jinkai01 awk]# awk -F ':' '$3>1000 || $7=="/bin/bash"' passwd
root:x:0:0:root:/root:/bin/bash
linuxprobe:x:1000:1000:linuxprobe:/home/linuxprobe:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash
user2:x:1002:1002::/home/user2:/bin/bash

awk 的內置變量

awk經常使用的變量有OFS、NF和NR,OFS和-F選項有相似的功能,也是用來定義分隔符的,可是它是在輸出的時候定義,NF表示用分隔符分隔後一共有多少段,NR表示行號。
OFS的用法示例以下:

打印出passwd 文檔中以:爲分隔符的第一,三,四列,而且以#號爲分隔符

[root@jinkai01 awk]# head -5 passwd | awk -F ':' '{OFS="#"} {print $1,$3,$4}'
root#0#0
bin#1#1
daemon#2#2

打印出passwd 文檔中以:爲分隔符,第三列大於1000的行,而後打印出其中的第1,2,3,4列,且從新以#號爲分隔符

[root@jinkai01 awk]# awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' passwd
user1#x#1001#1001
user2#x#1002#1002

變量NF的具體用法以下
NF爲列,下面是查詢passwd 文檔以:爲分隔符總共有幾列

[root@jinkai01 awk]# head -3 passwd |awk -F ':' '{print NF}'
7
7
7

這裏NF是多少段,$NF是最後一段的值。

[root@jinkai01 awk]# head -3 passwd |awk -F ':' '{print $NF}'
/bin/bash
/sbin/nologin
/sbin/nologin

變量NR的具體用法以下:
NR爲行,打印出行號

[root@jinkai01 awk]# head -3 passwd |awk -F ':' '{print NR}'
1
2
3

還可使用NR做爲判斷條件

將passwd文檔中行號大於18的行打印出來
[root@jinkai01 awk]# cat passwd | wc -l
21
[root@jinkai01 awk]# awk 'NR>18' passwd
linuxprobe:x:1000:1000:linuxprobe:/home/linuxprobe:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash
user2:x:1002:1002::/home/user2:/bin/bash

NR也能夠配合段匹配一塊兒使用,以下所示
將passwd 文檔中以:爲分隔符,行號小於20 而且第一列爲root的行打印出來

[root@jinkai01 awk]# awk -F ':' 'NR<20 && $1 ~ /root/' passwd
root:x:0:0:root:/root:/bin/bash

awk 中的數學運算

awk能夠更改段值,示例命令以下:
將passwd文檔中以:爲分隔符,第一列改爲 root。
=一個等號是賦值,==兩個等號纔是等於;

[root@jinkai01 awk]# head -n 3 passwd | 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也能夠對各個段的值進行數學運算,示例命令以下:
將passwd文檔中,以:號爲分隔符,將第七列賦值爲第三列和第四列的和

[root@jinkai01 awk]# head -2 passwd | awk -F ':' '{$7=$3+$4; print $0}'
root x 0 0 root /root 0
bin x 1 1 bin /bin 2

awk還能夠計算某個段的總和,示例命令以下:
tot 爲上一次tot值加下一行第三列的值,最開始tot爲零,循環匹配到最後一行第三列,而後打印出總和值
END是awk特有的語法,表示全部的行都已經執行。

[root@jinkai01 awk]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' passwd
4610





課後習題

(1) 用awk打印整個test.txt。(如下操做都是針對test.txt的,用awk工具實現。)

awk '{print $0}' test.txt

(2) 查找全部包含bash的行。

awk '/bash/' test.txt

(3) 用:做爲分隔符,查找第3個字段等於0的行。

awk -F':' '$3=="0"' test.txt

(4) 用:做爲分隔符,查找第1個字段爲root的行,並把該段的root換成toor。(能夠連同sed一塊兒使
用。)

awk -F':' '$1=="root"' test.txt |sed 's/root/toor/'

(5) 用:做爲分隔符,打印最後一個字段。

awk -F':' '{print $NF}' test.txt

(6) 打印行數大於20的全部行。

awk -F':' 'NR>20' test.txt

(7) 用:做爲分隔符,打印全部第3個字段小於第4個字段的行。

awk -F':' '$3<$4' test.txt

(8) 用:做爲分隔符,打印第1個字段以及最後一個字段,而且中間用@鏈接(例如,第1行應該是
這樣的形式:root@/bin/bash)。

awk -F':' '{print $1"@"$NF}' test.txt

(9) 用:做爲分隔符,把整個文檔的第4個字段相加,求和。

awk -F':' '{(sum+=$4)}; END {print sum}' test.txt

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