awk是一種編程語言,用於在linux/unix下對文本和數據進行處理(gawk - pattern scanning and processing language)。centos7中的awk是gawk的連接。它支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大編程工具。前面的grep、sed只是單純的工具,而awk已是一門語言了,可見awk的功能將比較強大linux
用法:
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命令shell
awk命令可以方便的經過指定分隔記號將文本分紅特定的列,而後在針對分出來的豎列進行操做編程
一、顯示test.txt文檔的第一列前5行。centos
awk -F ':' '{print $1}' test.txt | head -n 5bash
命令解釋:-F ':' 就是說這個文件以:做爲分隔符,咱們作實驗的是passwd文件,它自己就被:分割成了7段,'{}'中就是操做的描述,命令中的print $1 就是顯示第1列。編程語言
二、顯示test.txt文件全部豎列的內容ide
awk -F ':' '{print $0}' test.txt
awk '{print $0}' test.txt函數
注意與上一條命令的區別,$1表示第一列,$0表示全部列。工具
效果上其實和cat同樣。
三、awk也能夠
awk命令在沒有指定-F 分割符號或分割字符串時,默認以空格或者空白段做爲分隔符
咱們先建立一個測試文檔,以空格做爲分隔符
後咱們輸入下列命令
awk '{print $1}'
awk '{print $1,$3}'
awk '{print $1,$2}'
能夠看出awk自動把空格做爲分段記號,無論是多少個空格。
四、指定#爲顯示分隔符顯示特定列(注意不會影響原始文件,只是影響顯示)
awk -F ':' '{print $1"#"$3"#"$7}' test.txt
awk 搜索操做時與sed命令同樣,awk默認支持正則,不須要像grep -E , sed -r 同樣須要專門選項。
一、搜索含關鍵字root的行
awk '/root/' test.txt
二、搜索第一豎列中含有oo字符的行。
sed -F ':' '$1 ~/oo/' test.txt
注意這個波浪號~就是匹配的意思。
三、搜索root和test任意匹配其中一個所在的行的第一列和第三列
awk -F ':' '/root/{$1,$3} /test/{$1,$3}' test.txt
awk -F ':' '/root|test/ {print $0}' test.txt
四、搜索分割後第三段==0的行,也就是uid是零的行。
awk -F ':' '$3==0' test.txt
這一列也能夠拓展到其餘數學表達式
awk -F ':' '$3>=1000' test.txt
awk -F ':' '$3<=100' test.txt
五、搜索分割後最後不是/sbin/nologin的行
awk -F ':' '$7!="/sbin/nologin" {print $1}' test.txt
寫正則時兩個注意點:一是否是什麼的表達式爲!=,二是字符串匹配時要用雙引號
六、搜索第三列大於第四列或者第七列==/sbin/nologin的行
awk -F ':' '$3>$4||$7=="sbin/nologin"' test.txt
||表示或者,&&表示而且。
七、搜索第三列大於第四列和第七列==/sbin/nologin的行
awk -F ':' '$3>$4||$7&&"sbin/nologin"' test.txt
awk命令自帶了一些變量:
OFS:系統分隔符
NR:總行數變量
NF:分割後最大段數數值
一、列出第三列大於1000數字或者第七段包含/bash/的行,打印這些行的一、三、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
二、顯示分段的最後一行
awk -F ':' '{print $NF}' test |head -n3
$NF 表示末段 NF表示段數,是一個數字
三、顯示文件,並在每一行前加上行號==grep -n
awk -F ':' {print NR":"$0} test.txt
grep -n '' test.txt
四、顯示前10行,同時複習sed寫法。
awk -F':' 'NR<=10 {print $0}' test.txt
sed -n '1,10'p test.txt
同時複習sed寫法
五、利用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 -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt