awk 通過判斷模式(pattern)的值來決定是否執行其後對應的動作(actions)。首先來看一下awk中幾個常見的模式,在前十部分中,有一些模式已經做了介紹,在這裡再總結一下:
1、begin是awk 的保留字,是一種特殊的模式。
begin 成立(其值為true)的時機是:「awk 程式一開始執行,還沒有讀取任何資料之前」。 所以在begin 語法中,actions只在程式一開始執行時被執行一次。當awk 從資料檔案讀入資料行後,begin 便不再成立,所以不論資料檔案有多少資料行資料,actions也不會被再次執行。一般情況下,把「與資料檔案內容無關」和「只需執行ㄧ次」的部分放在以begin 為模式的actions中。
比如:[root@myfreelinux pub]# cat begin.awk
#!/bin/awk -f
begin
有些awk程式不需要讀入任何資料行,這情況可把整個程式寫在以begin 為模式的函式中,有時候也可以寫在以end為模式的函式中,end後面介紹。
例如:[root@myfreelinux pub]# awk 『begin』會列印出「hello world!」,在awk語句後面則不需要有資料檔案,這就是begin模式的特點。
2、end模式
end是awk 的保留字,也是乙個特殊的模式。end 成立(其值為true)的時機和begin成立的時機正好相反,end成立的時機是:「awk 處理完所有資料, 即將離開程式時」,在平常讀入資料行時,end模式不成立,所以end對應的actions 並不被執行;只有當awk處理完所有資料後,end對應的actions才會被執行。
和begin模式一樣,不管資料檔案有多少行資料,該actions只被執行一次。
3、關係表示式
awk 中提供了很多關係運算子(relation operator)
運算子 含意
> 大於
< 小於
>= 大於或等於
<= 小於或等於
== 等於
!= 不等於
~ 匹配 match
!~ 不匹配not match
以上關係運算子除~(match)與!~(not match)外,和c 語言中的含意一樣。 ~(match) 與!~(match) 在awk的含意簡述如下: 如果a 為一字串,b 為一正規表示式,那麼a~b就是判斷字串a 中是否包含能匹配(match)b式樣的子字串;而a!~b是判斷 字串a 中是否沒有包含能匹配(match)b式樣的子字串。
例如:[root@myfreelinux pub]# awk 『begin}』,是判斷a中是否有可以匹配b的子字串,即「abcdef中是否包含有「cd」,如果有,則列印出a字串。
再比如$0 ~ /program[0-9]+/.c/,模式中被用來比對的字串為$0 時,可只以正規表示式部分表示整個模式。所以這個表示式可以將模式部分$0 ~/program[0-9]+/.c/僅用/program[0- 9]+/.c/來表示,因為正規表示式中「.」有特殊含義,所以在這裡使用/轉義一下。
4、正規表示式
在awk中可以直接使用正規表示式當成模式;這是$0~ 正規表示式的簡寫。這種模式用來判斷$0(資料行) 中是否含有匹配該正規表示式的子字串;如果含有則成立(true)並執行其對應的actions。
例如:[root@myfreelinux pub]# echo 「123″>inte
[root@myfreelinux pub]# awk 『』 inte
this line is integer!
與[root@myfreelinux pub]# awk 『』 inte 相同
5、混合模式
以上介紹的4中模式計算後結果為一邏輯值(true or false)。awk 各個邏輯值間可通過&&(and), ||(or), !(not) 結合成乙個新的邏輯值,所以可以將不同的邏輯值通過上述結合符號來結合成乙個新的模式,這樣可進行複雜的條件判斷。
例如: fnr >= 23 && fnr <= 28
上式利用&& (and) 將兩個模式求值的結果合併成乙個邏輯值,該式將資料檔案中第23行到28行向右移5格(先輸出5個空白字元) 後輸出。
關於fnr在這裡介紹一下,fnr同nr一樣都是awk 的內建變數,awk有時候處理多個檔案,nr會記錄所有檔案的行數,而fnr則每開啟乙個檔案,fnr會重新計數開啟檔案的行數,舉個例子看看:
[root@myfreelinux pub]# cat inte
123324
[root@myfreelinux pub]# cat integer
222333
444[root@myfreelinux pub]# awk 『』 inte integer
1 12 2
3 14 2
5 3上邊結果中,左側是nr輸出地是行數,一直在增加,右側是每個檔案的行數,這就是nr和fnr的區別。
6、模式1 , 模式2
遇到這種模式,awk 會設立乙個switch(或flag)。當awk讀入的資料行使得模式1 成立時,awk 會開啟(turn on)這switch。當awk讀入的資料行使得模式2 成立時,awk 會關上(turn off)這個switch。該模式成立的條件是:當這個switch 被開啟(turn on)時 (包括模式1, 或模式2 成立的情況)
例如:fnr >= 23 && fnr <= 28 可改寫為
fnr == 23 , fnr == 28
說明:當fnr >= 23 時,awk 就turn on 這個switch;因為隨著資料行的讀入,awk不停的累加fnr。當 fnr = 28 時,模式2 (fnr == 28) 便成立,這時awk 會關上這個switch。 當switch 開啟期間,awk 會執行 print 「 」 $0 ,關閉後,就不再列印了,也同樣達到了相同的效果。
awk的使用 第十四部分 awk的內部變數
awk的內部變數的個數不多,在這裡介紹的時候就不按照字母順序排列了,而是按相關性分類說明。argc argc表示命令行上除了選項 f,v,f等選項及其所對應的引數之外的所有引數的個數。如果將 awk程式 直接寫在命令列上,那麼argc是不會把 awk程式 計算在內的。argv argv是乙個資料,用...
全球首發!慣性導航導論(劍橋大學)第十一部分
為了跟蹤ins的位置,將加速度計得到的加速度訊號 然後減去重力加速度,對剩餘的加速度積分一次得到速度,再積分一次得到位移 式中與姿態 attitude 演算法一樣,必須使用整合方案來積分從加速度計到達的樣本。使用矩形規則的簡單實現,後續更新方程 加速度計中產生的誤差通過二次積分傳播,如第4.2節所述...
awk的使用 第十三部分 awk的字串和數學函式
awk 的內建函式 built in functions 一 字串函式 語法 index 原字串,尋找的子字串 解釋 若原字串中含有欲找尋的子字串,則返回該子字串在原字串中第一次出現的位置,如果沒有出現該子字串則返回0。例如執行 root myfreelinux pub awk begin 5 是返...