前面也提到了 awk 和 sed 同樣是流式編輯器,它也是針對文檔中的行來操做的,一行一行的去執行。awk 比 sed 更增強大,它能作到 sed 能作到的,一樣也能作到 sed 不能作到的。awk 工具實際上是很複雜的,有專門的書籍來介紹它的應用,不過我認爲學那麼複雜沒有必要,只要能處理平常管理工做中的問題便可。正則表達式
一樣的,作一下準備工做,見下圖,vim
先操做 awk 最簡單的功能,指定分隔符 -F ,來查看一下文件 test.txt 的內容,見下圖,編輯器
接着指定分隔符爲「:」,輸出第一列,見下圖,工具
上圖的操做命令,也不會更改文件的內容,跟 sed 同樣。既然能夠輸出第一列,也能夠輸出指定的列或是所有輸出,輸出第三列,見下圖,測試
輸出所有的列,用 $0 表示,見下圖,blog
所有輸出還有一個簡單的命令,不用指定分隔符,不用 -F,見下圖,排序
來試着操做一下,不指定分隔符的狀況,先建立一個測試的文件 1.txt ,輸入 vim 1.txt ,回車,見下圖,文檔
輸入上圖內容,保存後退出。接着往下操做,字符串
以上說明 awk 忽略 -F 的選項,也就是沒有指定默認的分隔符,默認會以空格或是空白字符爲分隔符去打印。想要多打印幾列,就能夠用「,」來顯示。數學
上圖中的分隔符,除了空格,也可使用 # ,要用雙引號引發來 "#",見下圖,
假如須要分的段比較多的話,用以上操做就會很是麻煩,實際上還有一種方法,等會會說。
接着來講一下 awk 的匹配功能,見下圖,
上圖第二個命令就是 awk 和 sed 、grep 不一樣的地方,能夠分列匹配查找。awk 一樣也支持正則表達式,見下圖,
上圖命令使用了正則表達式 + 。awk 這邊比 grep 和 sed 強大的地方是,使用到正則表達式的時候都不用加選項或是脫義字符。,能夠直接寫出命令並執行。
awk 也支持同時使用多個表達式,見下圖,
上圖中,包含 root 和 user 的結果,並無所有顯示出 root 或 user,可使用命令 grep -E 命令來驗證結果。awk 命令也能夠用上圖 grep -E 的命令形式,結果是同樣的,見下圖,
接着來看一下數學公式計算的用法,見下圖,
上圖命令必定要寫兩個等號 == ,才能表示等於。寫一個等號 = 的話就至關於賦值了。{ } 花括號的內容不寫的話,默認是所有輸出。也可使用 >= 大於等於號,驗證結果以後也是沒錯的。若是在數值上面用「」雙引號引發來的話,是什麼結果呢?見下圖,
上圖的命令,在數值上加了 " " 雙引號,至關於 sort 命令不加 -n ,就是以 ASCII 碼的排序方式來計算的,命令就會認爲雙引號裏面的內容是字符串而不是數字。因此,命令裏面的數字要用來計算的話,就不能加雙引號。
還有不等於號,用 != 表示,見下圖,
上圖命令中 /sbin/nologin 表示的是字符串,因此要用雙引號。結果能夠看到,顯示出來的行裏面,最後一段都沒有 /sbin/nologin 。其中 != 這邊沒有使用空格,要注意。
除了上面使用數字進行比較以外,還能夠列與列之間進行比較,見下圖,
還能夠兩個條件在一塊兒使用,見下圖,
&& 表示而且的意思,注意上面數字使用的是雙引號 「」,因此結果出現了 59 。
除了而且以外,還有或者,見下圖,
|| 表示或者,兩個條件知足其中一個就能夠。接着往下操做,
~ 表示匹配包含。
OFS 內置變量,用來表示輸出的分隔符,具體用法見下圖,
OFS 須要用 { } 花括號括起來,而且用在單引號 ' ' 命令的最前面,接着纔是條件和 print 語句。 不寫中間的條件的話,就是所有,見下圖,
條件裏面還能夠寫入邏輯語句,見下圖,
定義輸出的分隔符和輸出的內容中間,就是條件,中間的條件和後面的 print 能夠一塊兒寫,用花括號 { } 整個括起來。表示 if $3>1000 ,就輸出 一、三、7 列。下面這條命令的寫法,就是省略掉了 if ,if 去掉能夠去掉不少符號。可是加上 if 以後,比較好理解。
下面再介紹兩個內置的變量,除了OFS,還有 NR 和 NF 。NR 表示行,NF 表示列。接着舉例子,見下圖,
結果顯示出來,至關於 grep -n 的做用,顯示行號。NF 就是顯示列號,見下圖,
結果所有是 7 列。
如今不妨改一下文件 test.txt 的內容,輸入 vi test.txt ,回車,見下圖,
將第一行的內容,刪除一列,保存後退出,接着往下操做,
能夠看到第一行的列數變爲 6 了。
NR 和 NF 還能夠做爲判斷的條件, 具體用法見下圖,
上圖第一條命令顯示的結果是前十行。第二條命令顯示還能夠兩個條件一塊兒用。
接着看下面這個例子,:冒號須要用雙引號 ""引發來,
由於 NR 一共只有 7 列,全部結果顯示的行,就前面7行有前半部分,
對於上圖命令的理解,用這麼一段話解釋:
awk 是按行處理文件的,每一行都有awk內置變量:NF,NR
NF:是按給定的分隔符,分出來總的段數, 全部$NF,指最後一段。
NR:是當前行的行號。$NR,表示 第N行的第N段。
老師的示例中,每行有7段,因此,前面7行,第一列,分別顯示當前行的段。如第一行顯示第一段,第二行顯示 第二段,第三行顯示 第三段。。。。
以上說明,加上$和不加$,是不同的。
接着來看一個和 == 兩個等號相對應的功能,見下圖,
能夠看到,第一條命令的 = 等號就是賦值,前三行的第一列都變成 root 了。第二條命令的 == 兩個等號纔是等於的意思。第一條命令的結果沒有分隔符,能夠輸入變量 OFS 來定義分隔符,見第三條命令。
接着再往下操做,見下圖,
這邊的 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 表示列