Linux shell基礎(六)awk命令 ver0.2

一、awk命令

awk是一種編程語言,用於在linux/unix下對文本和數據進行處理(gawk - pattern scanning and processing language)。centos7中的awk是gawk的鏈接。它支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大編程工具。前面的grep、sed只是單純的工具,而awk已經是一門語言了,可見awk的功能將比較強大

用法:
awk -F '分割記號' ‘script’ files
awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)

選項:
-F fs fs指定輸入分隔符,fs可以是字符串或正則表達式,如-F:
-v var=value 賦值一個用戶定義變量,將外部變量傳遞給awk
-f scripfile 從腳本文件中讀取awk命令

二、對文本豎列的操作

awk命令能夠方便的通過指定分隔記號將文本分成特定的列,然後在針對分出來的豎列進行操作

1、顯示test.txt文檔的第一列前5行。

awk -F ':' '{print $1}' test.txt | head -n 5

命令解釋:-F ':' 就是說這個文件以:作爲分隔符,我們做實驗的是passwd文件,它本身就被:分割成了7段,'{}'中就是操作的描述,命令中的print $1 就是顯示第1列。

Linux shell基礎(六)awk命令 ver0.2

2、顯示test.txt文件所有豎列的內容

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

注意與上一條命令的區別,$1表示第一列,$0表示所有列。
Linux shell基礎(六)awk命令 ver0.2

效果上其實和cat一樣。

3、awk也可以
awk命令在沒有指定-F 分割符號或分割字符串時,默認以空格或者空白段作爲分隔符

我們先創建一個測試文檔,以空格作爲分隔符
Linux shell基礎(六)awk命令 ver0.2

後我們輸入下列命令

awk '{print $1}'
awk '{print $1,$3}'
awk '{print $1,$2}'

Linux shell基礎(六)awk命令 ver0.2

可以看出awk自動把空格作爲分段記號,不管是多少個空格。

4、指定#爲顯示分隔符顯示特定列(注意不會影響原始文件,只是影響顯示)

awk -F ':' '{print $1"#"$3"#"$7}' test.txt

Linux shell基礎(六)awk命令 ver0.2

三、awk匹配功能舉例

awk 搜索操作時與sed命令一樣,awk默認支持正則,不需要像grep -E , sed -r 一樣需要專門選項。
1、搜索含關鍵字root的行

awk '/root/' test.txt

Linux shell基礎(六)awk命令 ver0.2

2、搜索第一豎列中含有oo字符的行。

sed -F ':' '$1 ~/oo/' test.txt

Linux shell基礎(六)awk命令 ver0.2

注意這個波浪號~就是匹配的意思。

3、搜索root和test任意匹配其中一個所在的行的第一列和第三列

awk -F ':' '/root/{$1,$3} /test/{$1,$3}' test.txt
awk -F ':' '/root|test/ {print $0}' test.txt

Linux shell基礎(六)awk命令 ver0.2

Linux shell基礎(六)awk命令 ver0.2

4、搜索分割後第三段==0的行,也就是uid是零的行。

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

Linux shell基礎(六)awk命令 ver0.2

這一列也可以拓展到其他數學表達式

awk -F ':' '$3>=1000' test.txt

Linux shell基礎(六)awk命令 ver0.2

awk -F ':' '$3<=100' test.txt

Linux shell基礎(六)awk命令 ver0.2

5、搜索分割後最後不是/sbin/nologin的行

awk -F ':' '$7!="/sbin/nologin" {print $1}' test.txt

Linux shell基礎(六)awk命令 ver0.2

寫正則時兩個注意點:一是不是什麼的表達式爲!=,二是字符串匹配時要用雙引號

6、搜索第三列大於第四列或者第七列==/sbin/nologin的行

awk -F ':' '$3>$4||$7=="sbin/nologin"' test.txt

Linux shell基礎(六)awk命令 ver0.2

||表示或者,&&表示並且。

7、搜索第三列大於第四列和第七列==/sbin/nologin的行

awk -F ':' '$3>$4||$7&&"sbin/nologin"' test.txt

Linux shell基礎(六)awk命令 ver0.2

四、awk內置變量功能舉例

awk命令自帶了一些變量:
OFS:系統分隔符
NR:總行數變量
NF:分割後最大段數數值

1、列出第三列大於1000數字或者第七段包含/bash/的行,打印這些行的1、3、7段,並且用#做顯示分隔符。

awk -F ':' '{OFS="#"} $3>1000|| $7 ~ /bash/ {print $1,$3,$7}' test.txt
awk -F ':' '{OFS="#"} {if ($3>1000|| $7 ~ /bash/){print $1,$3,$7}}' test.txt

Linux shell基礎(六)awk命令 ver0.2

Linux shell基礎(六)awk命令 ver0.2
2、顯示分段的最後一行

awk -F ':' '{print $NF}' test |head -n3

Linux shell基礎(六)awk命令 ver0.2
$NF 表示末段 NF表示段數,是一個數字

3、顯示文件,並在每一行前加上行號==grep -n

awk -F ':' {print NR":"$0} test.txt
grep -n '' test.txt

Linux shell基礎(六)awk命令 ver0.2
Linux shell基礎(六)awk命令 ver0.2

4、顯示前10行,同時複習sed寫法。

awk -F':' 'NR<=10 {print $0}' test.txt
sed -n '1,10'p test.txt

Linux shell基礎(六)awk命令 ver0.2

Linux shell基礎(六)awk命令 ver0.2
同時複習sed寫法

5、利用awk命令給$1f賦值

head -n3 test.txt| awk -F ':' '{OFS=":"} $1="root"' test.txt

Linux shell基礎(六)awk命令 ver0.2

注意與head -n3 test.txt| awk -F ':' '{OFS=":"} $1=="root"' test.txt的區別
Linux shell基礎(六)awk命令 ver0.2

五、awk數學運算舉例

1、計算第三段的值的和

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

Linux shell基礎(六)awk命令 ver0.2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章