一、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列。
2、顯示test.txt文件所有豎列的內容
awk -F ':' '{print $0}' test.txt
awk '{print $0}' test.txt
注意與上一條命令的區別,$1表示第一列,$0表示所有列。
效果上其實和cat一樣。
3、awk也可以
awk命令在沒有指定-F 分割符號或分割字符串時,默認以空格或者空白段作爲分隔符
我們先創建一個測試文檔,以空格作爲分隔符
後我們輸入下列命令
awk '{print $1}'
awk '{print $1,$3}'
awk '{print $1,$2}'
可以看出awk自動把空格作爲分段記號,不管是多少個空格。
4、指定#爲顯示分隔符顯示特定列(注意不會影響原始文件,只是影響顯示)
awk -F ':' '{print $1"#"$3"#"$7}' test.txt
三、awk匹配功能舉例
awk 搜索操作時與sed命令一樣,awk默認支持正則,不需要像grep -E , sed -r 一樣需要專門選項。
1、搜索含關鍵字root的行
awk '/root/' test.txt
2、搜索第一豎列中含有oo字符的行。
sed -F ':' '$1 ~/oo/' test.txt
注意這個波浪號~就是匹配的意思。
3、搜索root和test任意匹配其中一個所在的行的第一列和第三列
awk -F ':' '/root/{$1,$3} /test/{$1,$3}' test.txt
awk -F ':' '/root|test/ {print $0}' test.txt
4、搜索分割後第三段==0的行,也就是uid是零的行。
awk -F ':' '$3==0' test.txt
這一列也可以拓展到其他數學表達式
awk -F ':' '$3>=1000' test.txt
awk -F ':' '$3<=100' test.txt
5、搜索分割後最後不是/sbin/nologin的行
awk -F ':' '$7!="/sbin/nologin" {print $1}' test.txt
寫正則時兩個注意點:一是不是什麼的表達式爲!=,二是字符串匹配時要用雙引號
6、搜索第三列大於第四列或者第七列==/sbin/nologin的行
awk -F ':' '$3>$4||$7=="sbin/nologin"' test.txt
||表示或者,&&表示並且。
7、搜索第三列大於第四列和第七列==/sbin/nologin的行
awk -F ':' '$3>$4||$7&&"sbin/nologin"' test.txt
四、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
2、顯示分段的最後一行
awk -F ':' '{print $NF}' test |head -n3
$NF 表示末段 NF表示段數,是一個數字
3、顯示文件,並在每一行前加上行號==grep -n
awk -F ':' {print NR":"$0} test.txt
grep -n '' test.txt
4、顯示前10行,同時複習sed寫法。
awk -F':' 'NR<=10 {print $0}' test.txt
sed -n '1,10'p test.txt
同時複習sed寫法
5、利用awk命令給$1f賦值
head -n3 test.txt| awk -F ':' '{OFS=":"} $1="root"' test.txt
注意與head -n3 test.txt| awk -F ':' '{OFS=":"} $1=="root"' test.txt的區別
五、awk數學運算舉例
1、計算第三段的值的和
awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt