9.6 awk命令正則表達式
awk 最簡單的功能,指定分隔符 -Fvim
上圖的操做命令,也不會更改文件的內容,跟 sed 同樣。既然能夠輸出第一列,也能夠輸出指定的列或是所有輸出,輸出第三列測試
輸出所有的列,用 $0 表示,所有輸出還有一個簡單的命令,不用指定分隔符,不用 -Fspa
不指定分隔符的狀況,先建立一個測試的文件 1.txt ,輸入 vim 1.txt ,回車排序
以上說明 awk 忽略 -F 的選項,也就是沒有指定默認的分隔符,默認會以空格或是空白字符爲分隔符去打印。想要多打印幾列,就能夠用「,」來顯示。字符串
上圖中的分隔符,除了空格,也可使用 # ,要用雙引號引發來 "#" 數學
awk 的匹配功能awk
awk 和 sed 、grep 不一樣的地方,能夠分列匹配查找。awk 一樣也支持正則表達式變量
上圖命令使用了正則表達式 + 。awk 這邊比 grep 和 sed 強大的地方是,使用到正則表達式的時候都不用加選項或是脫義字符。,能夠直接寫出命令並執行。
awk 也支持同時使用多個表達式,sed
上圖中,包含 root 和 user 的結果,並無所有顯示出 root 或 user,可使用命令 grep -E 命令來驗證結果。awk 命令也能夠用上圖 grep -E 的命令形式,結果是同樣的,見下圖,
看一下數學公式計算的用法,見下圖
必定要寫兩個等號 == ,才能表示等於。寫一個等號 = 的話就至關於賦值了。{ } 花括號的內容不寫的話,默認是所有輸出。也可使用 >= 大於等於號,驗證結果以後也是沒錯的。若是在數值上面用「」雙引號引發來的話,是什麼結果呢?見下圖,
上圖的命令,在數值上加了 " " 雙引號,至關於 sort 命令不加 -n ,就是以 ASCII 碼的排序方式來計算的,命令就會認爲雙引號裏面的內容是字符串而不是數字。因此,命令裏面的數字要用來計算的話,就不能加雙引號。還有不等於號,用 != 表示,見下圖,
root表示的是字符串,因此要用雙引號
除了上面使用數字進行比較以外,還能夠列與列之間進行比較
還能夠兩個條件在一塊兒使用,見下圖,
&& 表示而且的意思,注意上面數字使用的是雙引號 「」.
除了而且以外,還有或者,見下圖,
|| 表示或者,兩個條件知足其中一個就能夠。接着往下操做
~ 表示匹配包含
OFS 內置變量,用來表示輸出的分隔符,具體用法見下圖,
OFS 須要用 { } 花括號括起來,而且用在單引號 ' ' 命令的最前面,接着纔是條件和 print 語句。 不寫中間的條件的話,就是所有,見下圖,
條件裏面還能夠寫入邏輯語句
定義輸出的分隔符和輸出的內容中間,就是條件,中間的條件和後面的 print 能夠一塊兒寫,用花括號 { } 整個括起來。表示 if $3>999,就輸出 一、三、7 列。下面這條命令的寫法,就是省略掉了 if ,if 去掉能夠去掉不少符號。可是加上 if 以後,比較好理解。
下面再介紹兩個內置的變量,除了OFS,還有 NR 和 NF 。NR 表示行,NF 表示列。接着舉例子,見下圖,
3
結果顯示出來,至關於 grep -n 的做用
NR 和 NF 還能夠做爲判斷的條件, 具體用法見下圖,
接着看下面這個例子:
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 表示列