入門一班20181019 awk
9.6/9.7 awk
awk awk相對於sed 更方便的功能是支援了分段。
awk不會更改檔案的內容
最簡單的一種用法,以某種分隔符來分割後,取第幾部分打印出來。
awk -F ':' '{print $1}' passwd
-F 分隔符 {$1 第一部分}
{$1,$2,$3} 第一二三部分
{$0表示所有段} awk '{print $0}' passwd
如果希望分段出來的結果之間有一個分隔顯示,可以這樣
awk -F ":" '{print $1" "$2" "$3}' passwd 這個就是以:為分隔符,找出第一二三位,中間用空格隔開,當然空格也可以為其他符號
awk的匹配功能,類似sed的功能
匹配出有oo的段
awk '/oo/' passwd
在這個基礎上,如果想檢視第幾個段的,可以加上$位置~ 來匹配。比如像檢視第一個段落中是否有oo的
awk -F ':' '$1~ /oo/' passwd 這個場景使用在比如想在passwd查詢某一個使用者是否存在 因為第一個冒號前面是使用者名稱
awk可以支援多個表示式一起寫,比如我們想查詢含有root的第一位和第三位以及第一位可能有lo的所在行。
表示式要寫在一對單引號內,print的內容要用{}
使用場景:
awk -F ':' '/root/ {print $1,$3} $1~/lo+/ {print $0}' passwd
operator 11 是啥玩意?其實這個就是passwd裡的內容
使用awk 和grep同時來展示如何選出包含root 和 user的行
接下來的用法可以理解為一個簡易的數學運算表達
可以理解為這樣:以某種分隔符分割開後的每一部分進行比較, == >= !=
eg awk -F ':' '$1== "root"' passwd 分割後的第一部分是否為root
eg awk -F ':' '$3 >=1000' passwd 打印出第三部分大於等於1000的
注意這個被比較的是1000這個數字。如果把1000用雙引號引起來的話,就代表是字串,也就是按照1000的ANSCII碼值。預設如果是字串比較的話,必須使用雙引號
如果不寫print的範圍,預設的是全部 $0
從上面的例子可以看出,其實awk可以理解為簡單的小程式,包括了算數運算,邏輯運算的等。,可以隨心所欲的加各種判斷條件只要是符合awk的格式
awk -F ':' '$3<$4 {print $3,$4}' passwd 比較第三個第四位並打印出第三和第四位
如果想部分匹配該怎麼做? 使用匹配符 ~ 。
可以使用或 || 與 &&來進行條件的選擇或者同時滿足。
eg 我想匹配第三位小於第四位同時第一位的首字元是在a-h的範圍內
awk -F ':' '$3<$4 && $1 ~"^[a-h]"' passwd 匹配符~ 記得用雙引號引起來條件
OFS內建變數是用來指定print時候用的分隔符。幾個注意的地方:
OFS要在大括號裡進行定義
2. OFS要寫在條件的前面
eg awk -F ':' '{OFS="*****"} $3>1000 || $7~ /bash/ {print $1,$3,$7}' passwd
NR NF這兩個內建變數
NR代表有多少行 NF代表有多少列
甚至可以加判斷條件 if
也可以將行號加在前面
awk -F ':' '{print NF ":" $0}' passwd
列印前十行,同時列印行號
awk -F ':' 'NR <=10 {print NR "-"$0}' passwd
awk -F ':' '{print $NR":" $NF }' passwd
這個相當於 $1:$7 $2:$7 ------$行數:$7
接下來的這個,注意== 和 =的區別,同時可以看看 OFS的用法
tot是total的變數 求和.注意語法。 注意!!!tot不是內建變數。和OFS 不一樣。在這裡這個變數可以用任何數代替。
awk -F ':' '{tot=tot+$4}; END {print tot}' passwd 所有第四段的和,簡單的求和運算。
還有就是加上判斷,if後進行顯示。
總結一下
awk我認為是三種裡最簡單的,因為它具備了一定程式語言的特點,所以寫起來比較順手。
注意一些變數,語法以及雙引號和單引號的用法。
課後練習:
用awk 列印整個test.txt (以下操作都是用awk工具實現,針對test.txt)
查詢所有包含 ‘bash’ 的行
用 ‘:’ 作為分隔符,查詢第三段等於0的行
用 ‘:’ 作為分隔符,查詢第一段為 ‘root’ 的行,並把該段的 ‘root’ 換成 ‘toor’ (可以