正則介紹 awk

前面也提到了 awk 和 sed 一樣是流式編輯器,它也是針對文檔中的行來操作的,一行一行的去執行。awk 比 sed 更加強大,它能做到 sed 能做到的,同樣也能做到 sed 不能做到的。awk 工具其實是很複雜的,有專門的書籍來介紹它的應用,不過我認爲學那麼複雜沒有必要,只要能處理日常管理工作中的問題即可。

正則介紹 awk

同樣的,做一下準備工作,見下圖,
正則介紹 awk
先操作 awk 最簡單的功能,指定分隔符 -F ,來查看一下文件 test.txt 的內容,見下圖,
正則介紹 awk
接着指定分隔符爲“:”,輸出第一列,見下圖,
正則介紹 awk
上圖的操作命令,也不會更改文件的內容,跟 sed 一樣。既然可以輸出第一列,也可以輸出指定的列或是全部輸出,輸出第三列,見下圖,
正則介紹 awk
輸出全部的列,用 $0 表示,見下圖,
正則介紹 awk
全部輸出還有一個簡單的命令,不用指定分隔符,不用 -F,見下圖,
正則介紹 awk

來試着操作一下,不指定分隔符的情況,先創建一個測試的文件 1.txt ,輸入 vim 1.txt ,回車,見下圖,
正則介紹 awk
輸入上圖內容,保存後退出。接着往下操作,
正則介紹 awk
以上說明 awk 忽略 -F 的選項,也就是沒有指定默認的分隔符,默認會以空格或是空白字符爲分隔符去打印。想要多打印幾列,就可以用“,”來顯示。
正則介紹 awk
上圖中的分隔符,除了空格,也可以使用 # ,要用雙引號引起來 "#",見下圖,
正則介紹 awk
假如需要分的段比較多的話,用以上操作就會非常麻煩,實際上還有一種方法,等會會說。
接着來說一下 awk 的匹配功能,見下圖,
正則介紹 awk
上圖第二個命令就是 awk 和 sed 、grep 不同的地方,可以分列匹配查找。awk 同樣也支持正則表達式,見下圖,
正則介紹 awk
上圖命令使用了正則表達式 + 。awk 這邊比 grep 和 sed 強大的地方是,使用到正則表達式的時候都不用加選項或是脫義字符。,可以直接寫出命令並執行。
awk 也支持同時使用多個表達式,見下圖,
正則介紹 awk
上圖中,包含 root 和 user 的結果,並沒有全部顯示出 root 或 user,可以使用命令 grep -E 命令來驗證結果。awk 命令也可以用上圖 grep -E 的命令形式,結果是一樣的,見下圖,
正則介紹 awk
接着來看一下數學公式計算的用法,見下圖,
正則介紹 awk
上圖命令一定要寫兩個等號 == ,才能表示等於。寫一個等號 = 的話就相當於賦值了。{ } 花括號的內容不寫的話,默認是全部輸出。也可以使用 >= 大於等於號,驗證結果之後也是沒錯的。如果在數值上面用“”雙引號引起來的話,是什麼結果呢?見下圖,
正則介紹 awk
上圖的命令,在數值上加了 " " 雙引號,相當於 sort 命令不加 -n ,就是以 ASCII 碼的排序方式來計算的,命令就會認爲雙引號裏面的內容是字符串而不是數字。所以,命令裏面的數字要用來計算的話,就不能加雙引號。
還有不等於號,用 != 表示,見下圖,
正則介紹 awk
上圖命令中 /sbin/nologin 表示的是字符串,所以要用雙引號。結果可以看到,顯示出來的行裏面,最後一段都沒有 /sbin/nologin 。其中 != 這邊沒有使用空格,要注意。

除了上面使用數字進行比較之外,還可以列與列之間進行比較,見下圖,
正則介紹 awk
還可以兩個條件在一起使用,見下圖,
正則介紹 awk
&& 表示並且的意思,注意上面數字使用的是雙引號 “”,所以結果出現了 59 。
除了並且之外,還有或者,見下圖,
正則介紹 awk
|| 表示或者,兩個條件滿足其中一個就可以。接着往下操作,
正則介紹 awk
~ 表示匹配包含。
OFS 內置變量,用來表示輸出的分隔符,具體用法見下圖,
正則介紹 awk
OFS 需要用 { } 花括號括起來,並且用在單引號 ' ' 命令的最前面,接着纔是條件和 print 語句。 不寫中間的條件的話,就是全部,見下圖,
正則介紹 awk
條件裏面還可以寫入邏輯語句,見下圖,
正則介紹 awk
定義輸出的分隔符和輸出的內容中間,就是條件,中間的條件和後面的 print 可以一起寫,用花括號 { } 整個括起來。表示 if $3>1000 ,就輸出 1、3、7 列。下面這條命令的寫法,就是省略掉了 if ,if 去掉可以去掉很多符號。但是加上 if 之後,比較好理解。
下面再介紹兩個內置的變量,除了OFS,還有 NR 和 NF 。NR 表示行,NF 表示列。接着舉例子,見下圖,
正則介紹 awk
結果顯示出來,相當於 grep -n 的作用,顯示行號。NF 就是顯示列號,見下圖,
正則介紹 awk
結果全部是 7 列。
現在不妨改一下文件 test.txt 的內容,輸入 vi test.txt ,回車,見下圖,
正則介紹 awk
將第一行的內容,刪除一列,保存後退出,接着往下操作,
正則介紹 awk
可以看到第一行的列數變爲 6 了。
NR 和 NF 還可以作爲判斷的條件, 具體用法見下圖,
正則介紹 awk
上圖第一條命令顯示的結果是前十行。第二條命令顯示還可以兩個條件一起用。
接着看下面這個例子,:冒號需要用雙引號 ""引起來,
正則介紹 awk
因爲 NR 一共只有 7 列,所有結果顯示的行,就前面7行有前半部分,
正則介紹 awk
對於上圖命令的理解,用這麼一段話解釋:
awk 是按行處理文件的,每一行都有awk內置變量:NF,NR
NF:是按給定的分隔符,分出來總的段數, 所有$NF,指最後一段。
NR:是當前行的行號。$NR,表示 第N行的第N段。
老師的示例中,每行有7段,所以,前面7行,第一列,分別顯示當前行的段。如第一行顯示第一段,第二行顯示 第二段,第三行顯示 第三段。。。。

以上說明,加上$和不加$,是不一樣的。
接着來看一個和 == 兩個等號相對應的功能,見下圖,
正則介紹 awk
可以看到,第一條命令的 = 等號就是賦值,前三行的第一列都變成 root 了。第二條命令的 == 兩個等號纔是等於的意思。第一條命令的結果沒有分隔符,可以輸入變量 OFS 來定義分隔符,見第三條命令。
接着再往下操作,見下圖,
正則介紹 awk
這邊的 tot 是求和的意思, tot=tot+$3 意思是,新的tot的值,爲舊的tot的值和$3的值的和。這個 tot 的值之前並不存在,所以默認是 0 ,從 0 開始求和,每一行的第3列相加。相加完成之後,就輸出 tot 的值。
這裏的END要注意一下,表示所有的行都已經執行,這是awk特有的語法。其實awk連同sed都可以寫成一個腳本文件,而且有他們特有的語法,在awk中使用 if 判斷、for 循環都是可以的,只是日常管理工作中沒有必要使用那麼複雜的語句而已。

總結:
-F 指定分隔符
$0 全部輸出
兩個等號 == ,才能表示等於
數值上加了 " " 雙引號,輸出結果就是以 ASCII 碼的排序方式來計算
!= 表示不等於
&& 表示並且
|| 表示或者
OFS 內置變量,用來表示輸出的分隔符
內置變量 NR 表示行,NF 表示列

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