linux awk 運算子

Augusdi發表於2015-04-22

linux awk 運算子

awk 作為文字處理優秀工具之一,它有自己豐富的運算子,可分為:算術運算子,賦值運算子,關係運算子,邏輯預演算法,正則運算子。


一、運算子介紹

運算子描述
賦值運算子
=    +=    -=     *=    /=    %=     ^=  賦值語句
邏輯運算子
||邏輯或
&&邏輯與
正則運算子
~   ~!匹配正規表示式和不匹配正規表示式
關係運算子
<     <=   >    >=     !=     ==關係運算子
算術運算子
+ -加,減
*   /   &乘,除與求餘
+   -   !一元加,減和邏輯非
^  ***求冪
++    --增加或減少,作為字首或字尾
其它運算子
$欄位引用
空格字串連線符
? :C條件表示式
in陣列中是否存在某鍵值

說明:awk運算子基本與c語言類似,表示式及功能基本相同


二、例項介紹

1) awk賦值運算子

awk 'BEGIN{a=5; a+=5; print a; a*=2; print a; a^=2; print a; a%=2; print a;}'

結果:

10                        #  a+=5  ->  10             
20                        #  a*=5   ->  20
400                     #  a^=2   ->  400
0                         #  a%=2  ->  0


2) awk邏輯運算子

awk 'BEGIN{a=1; b=2; print (a>0), (b<0), (a>5 && b<=2),(a>5 || b<=2);}'

結果:

1 0 0 1                 #  true : 1;  false : 0


3) awk正則運算子

awk 'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}'

結果:

ok                       # a 是否符合正則匹配: 字串a是以100開頭;  示例符合100開頭,因此正則匹配成功


4) awk關係運算子

awk 'BEGIN{a=11; if(a >= 9){print "ok";}}'                   # 數值比較

結果:

ok         


awk 'BEGIN{a="11"; if(a >= 9){print "ok";} else{print "no";}}'            # 字串比較

結果:

no


說明:

 > < 可以作為字串比較,也可以用作數值比較,關鍵看運算元如果只要有一個是字串,就會轉換為字串比較。兩個都為數字,才轉為數值比較。字串比較,按照ascii碼順序比較原則。

如示例2 字串比較,起始字元“1”在“9“之前,因此小於“9”,結果為“no”。


5) awk算術運算子

awk 'BEGIN{a="12"; print a, a++,++a; print a+2, a*2, a^2, !a}'

結果:
12 12 14                       # a = 12          a++ = 12          ++a = 14
16 28 196 0                 # 14 + 2           14 * 2         14 ^ 2     !14


6) 其它運算子

a) ? : 

awk 'BEGIN{a="b"; print a=="b" ? "ok" : "err";}'

結果: 

ok


b) in

awk 'BEGIN{a="b"; arr[0]="b"; arr["b"]="c"; print (a in arr); print arr[a];}'

結果:

1           #  arr下標中含有a(“b”),注意是下標,不是數值
c           #  arr[a] = arr["b"] = "c" ,先把a作為下標,然後根據下標取數值


c) 空格

awk 'BEGIN{arr="a b  c    d"; gsub(/ +/, "#", arr); print arr;}'

結果:

a#b#c#d                   # 正則匹配替換多個空格為“#”


d) $

echo "a b  c    d" | awk '{print $1, $3}'

結果:

a c          # 列印第1和第3個域值,預設以空格分割



三、字串操作

awk中的資料型別是不需要定義,而是根據上下文語義自適應的,有時候需要強制轉換。

1) 字串 -> 數字

只需要將變數通過”+”連線運算,自動強制將字串轉為整型,非數字變成0(發現第一個非數字字元,後面自動忽略)

示例: awk 'BEGIN{a="100";b="10test1"; print (a+b+5);}'

結果: 115


2) 數字 -> 字串

只需要將變數與””符號連線起來運算即可。

示例: awk 'BEGIN{a=100; b=100; c=(a" "b); print c; a="101"; b=102; print a""b;}'

結果: 

100 100
101102


3) 字串連線

字串連線操作通”二“,”+”號操作符,模式強制將左右兩邊的值轉為數字型別,然後進行操作。

示例: awk 'BEGIN{a="a"; b="b"; c=(a""b); print c}'

結果: ab


示例: awk 'BEGIN{a="a"; b="b"; c=(a+b); print a, b, c}'

結果: a b 0           # “+”號把字元轉為數字,第一個非數字轉為0,因此 0+0=0



四、正規表示式

awk作為文字處理工具,是少不了正規表示式的。正規表示式就像一門程式語言,有自己語法規則。 

對於不同工具,其實大部分表示意思相同的。在linux眾多文字處理工具(awk、sed、grep、perl)裡面都用到正規表示式。正規表示式其實就只有3種型別,詳細可以參考:linux shell 正規表示式(BREs,EREs,PREs)差異比較 


1) 正則式語法

字元功能
+指定一個或多個字元,或擴充套件正規表示式的具體值(在 +(加號)前)在這個字串中,則字串匹配。
命令列: awk '/smith+ern/'   testfile

將包含字元 smit,後跟一個或多個 h 字元,並以字元 ern 結束的字串的任何記錄列印至標準輸出。

示例中的輸出是:smithern, harry smithhern, anne

?指定如果零個或一個字元或擴充套件正規表示式的具體值(在 ?(問號)之前)在字串中,則字串匹配。
命令列:awk '/smith?/'   testfile
將包含字元 smit,後跟零個或一個 h 字元的例項的所有記錄列印至標準輸出。
示例中的輸出是:smith, alan smithern, harry smithhern, anne smitters, alexis
|指定如果以 |(垂直線)隔開的字串的任何一個在字串中,則字串匹配。
命令列:awk '/allen | alan /'    testfile
將包含字串 allen 或 alan 的所有記錄列印至標準輸出。
示例中的輸出是:smiley, allen smith, alan
( )在正規表示式中將字串組合在一起。
命令列:awk '/a(ll)?(nn)?e/'   testfile
將具有字串 ae 或 alle 或 anne 或 allnne 的所有記錄列印至標準輸出。
示例中的輸出是:smiley, allen smithhern, anne
{m}指定如果正好有 m 個模式的具體值位於字串中,則字串匹配。
命令列:awk '/l{2}/'   testfile
列印至標準輸出smiley, allen
{m,}指定如果至少 m 個模式的具體值在字串中,則字串匹配。
命令列:awk '/t{2,}/'   testfile
列印至標準輸出:smitters, alexis
{m, n}指定如果 m 和 n 之間(包含的 m 和 n)個模式的具體值在字串中(其中m<= n),則字串匹配。
命令列:awk '/er{1, 2}/'   testfile
列印至標準輸出:smithern, harry smithern, anne smitters, alexis
[String]指定正規表示式與方括號內 String 變數指定的任何字元匹配。
命令列:awk '/sm[a-h]/'   testfile
將具有 sm 後跟以字母順序從 a 到 h 排列的任何字元的所有記錄列印至標準輸出。
示例的輸出是:
smawley, andy
[^ String]在 [ ](方括號)和在指定字串開頭的 ^ (插入記號) 指明正規表示式與方括號內的任何字元匹配。這樣
命令列:awk '/sm[^a-h]/'   testfile
列印至標準輸出:smiley, allen smith, alan smithern, harry smithhern, anne smitters, alexis
~,!~表示指定變數與正規表示式匹配(代字號)或不匹配(代字號、感嘆號)的條件語句。
命令列awk '$1 ~ /n/'   testfile
將第一個欄位包含字元 n 的所有記錄列印至標準輸出。
示例中的輸出是:
smithern, harry smithhern, anne
^指定欄位或記錄的開頭。
命令列:awk '$2 ~ /^h/'   testfile
將把字元 h 作為第二個欄位的第一個字元的所有記錄列印至標準輸出。
示例中的輸出是:
smithern, harry
$指定欄位或記錄的末尾。
命令列:awk '$2 ~ /y$/'   testfile
將把字元 y 作為第二個欄位的最後一個字元的所有記錄列印至標準輸出。
示例中的輸出是:
smawley, andy smithern, harry
. (句號)表示除了在空白末尾的終端換行字元以外的任何一個字元。
命令列:awk '/a..e/'   testfile
將具有以兩個字元隔開的字元 a 和 e 的所有記錄列印至標準輸出。
示例中的輸出是:
smawley, andy smiley, allen smithhern, anne
*(星號)表示零個或更多的任意字元。
命令列:awk '/a.*e/'   testfile
將具有以零個或更多字元隔開的字元 a 和 e 的所有記錄列印至標準輸出。
示例中的輸出是:
smawley, andy smiley, allen smithhern, anne smitters, alexis
\ (反斜槓)轉義字元。當位於在擴充套件正規表示式中具有特殊含義的任何字元之前時,轉義字元除去該字元的任何特殊含義。例如,
命令列:/a\/\//
將與模式 a // 匹配,因為反斜槓否定斜槓作為正規表示式定界符的通常含義。要將反斜槓本身指定為字元,則使用雙反斜槓。有關反斜槓及其使用的更多資訊,請參閱以下關於轉義序列的內容。

注: javascript、.net、java支援的正規表示式,基本上同上表


2) 正則式例項

a、 基本語法

awk ‘/REG/  {action}’

說明: /REG/為正規表示式,可以將當前一行記錄$0中,滿足條件的記錄送入到 action進行處理


示例: awk 'BEGIN{info="this is a test"; if( info ~ /test/){print "ok"}}'              # ~ 正則匹配符,表示是否滿足正則匹配

結果: ok


b、 正則函式

gsub( Ere, Repl, [ In ] )

sub( Ere, Repl, [ In ] )

match( String, Ere )

split( String, A, [Ere] )

詳細用法,請參加 linux awk 內建函式例項




參考推薦: 

awk 例項 (IBM)

沉于思考,默默學習

linux awk 內建函式例項

linux awk 內建變數例項

linux awk 陣列和迴圈

http://blog.csdn.net/ithomer/article/details/8476621

相關文章