1. 程式人生 > >入門一班20181019 awk

入門一班20181019 awk

9.6/9.7 awk






awk awk相對於sed 更方便的功能是支援了分段。

image.png

awk不會更改檔案的內容


最簡單的一種用法,以某種分隔符來分割後,取第幾部分打印出來。

awk -F ':' '{print $1}' passwd

-F 分隔符  {$1 第一部分}

{$1,$2,$3} 第一二三部分

{$0表示所有段} awk '{print $0}' passwd

image.png


如果希望分段出來的結果之間有一個分隔顯示,可以這樣

awk -F ":" '{print $1" "$2" "$3}' passwd 這個就是以:為分隔符,找出第一二三位,中間用空格隔開,當然空格也可以為其他符號

image.png

image.png


awk的匹配功能,類似sed的功能

匹配出有oo的段

awk '/oo/' passwd

image.png

在這個基礎上,如果想檢視第幾個段的,可以加上$位置~ 來匹配。比如像檢視第一個段落中是否有oo的

awk -F ':' '$1~ /oo/' passwd 這個場景使用在比如想在passwd查詢某一個使用者是否存在 因為第一個冒號前面是使用者名稱

image.png


awk可以支援多個表示式一起寫,比如我們想查詢含有root的第一位和第三位以及第一位可能有lo的所在行。

表示式要寫在一對單引號內,print的內容要用{}


使用場景: 

awk -F ':' '/root/ {print $1,$3} $1~/lo+/ {print $0}' passwd  

image.png

operator 11 是啥玩意?其實這個就是passwd裡的內容

image.png

使用awk 和grep同時來展示如何選出包含root 和 user的行

image.png


接下來的用法可以理解為一個簡易的數學運算表達

可以理解為這樣:以某種分隔符分割開後的每一部分進行比較, == >= != 

eg awk -F ':' '$1== "root"' passwd  分割後的第一部分是否為root

image.png


eg awk -F ':' '$3 >=1000' passwd 打印出第三部分大於等於1000的

image.png

注意這個被比較的是1000這個數字。如果把1000用雙引號引起來的話,就代表是字串,也就是按照1000的ANSCII碼值。預設如果是字串比較的話,必須使用雙引號

如果不寫print的範圍,預設的是全部 $0

image.png

image.png     


image.png

從上面的例子可以看出,其實awk可以理解為簡單的小程式,包括了算數運算,邏輯運算的等。,可以隨心所欲的加各種判斷條件只要是符合awk的格式      

awk -F ':' '$3<$4 {print $3,$4}' passwd 比較第三個第四位並打印出第三和第四位

image.png


image.png

如果想部分匹配該怎麼做? 使用匹配符 ~ 。

可以使用或 || 與 &&來進行條件的選擇或者同時滿足。

eg 我想匹配第三位小於第四位同時第一位的首字元是在a-h的範圍內

awk -F ':' '$3<$4 && $1 ~"^[a-h]"' passwd  匹配符~ 記得用雙引號引起來條件

image.png


OFS內建變數是用來指定print時候用的分隔符。幾個注意的地方:

  1. OFS要在大括號裡進行定義

2. OFS要寫在條件的前面


image.png

eg  awk -F ':' '{OFS="*****"} $3>1000 || $7~ /bash/ {print $1,$3,$7}' passwd


image.png


NR NF這兩個內建變數

NR代表有多少行  NF代表有多少列

image.png


image.png


甚至可以加判斷條件 if 

image.png


image.png 


也可以將行號加在前面

awk -F ':' '{print NF ":" $0}' passwd

image.png


列印前十行,同時列印行號

awk -F ':' 'NR <=10 {print NR "-"$0}' passwd

image.png


awk -F ':' '{print $NR":" $NF }' passwd

這個相當於 $1:$7 $2:$7 ------$行數:$7


image.png


接下來的這個,注意== 和 =的區別,同時可以看看 OFS的用法

image.png



tot是total的變數 求和.注意語法。 注意!!!tot不是內建變數。和OFS 不一樣。在這裡這個變數可以用任何數代替。

awk -F ':' '{tot=tot+$4}; END {print tot}' passwd 所有第四段的和,簡單的求和運算。

image.png


還有就是加上判斷,if後進行顯示。

image.png



總結一下

awk我認為是三種裡最簡單的,因為它具備了一定程式語言的特點,所以寫起來比較順手。

注意一些變數,語法以及雙引號和單引號的用法。


課後練習:

  1. 用awk 列印整個test.txt (以下操作都是用awk工具實現,針對test.txt)

  2. 查詢所有包含 ‘bash’ 的行

  3. 用 ‘:’ 作為分隔符,查詢第三段等於0的行

  4. 用 ‘:’ 作為分隔符,查詢第一段為 ‘root’ 的行,並把該段的 ‘root’ 換成 ‘toor’ (可以