awk的使用 第十一部分 awk中常用的模式

2021-06-18 18:41:27 字數 2957 閱讀 4178

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 是返...