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)
相關文章
- awk 系列:怎樣使用 awk 變數、數值表示式以及賦值運算子變數賦值
- 運算子 運算子
- Linux 各種運算子Linux
- php運算子 比較運算子 邏輯運算子 三元運算子PHP
- 運算子-賦值運算子賦值
- MySQL的四種運算子(算術運算子、比較運算子、邏輯運算子和位運算子)MySql
- 【linux】Shell中的運算子Linux
- 8.Golang中的運算子-算術運算子、關係運算子、邏輯運算子、賦值運算子Golang賦值
- javascript運算子——邏輯運算子JavaScript
- 運算子的關係,什麼叫一元運算子,二元運算子,三元運算子,運算子優先順序,以及運算子的
- 運算子
- java零基礎自學第一天②,運算子:表示式,算術運算子,+操作,賦值運算子,自增自減運算子,關係運算子,邏輯運算子,三元運算子Java賦值
- javascript中&&運算子和||運算子的使用JavaScript
- 算術運算子裡的特殊運算子
- Linux Shell 雙括號運算子使用Linux
- javascript基礎(賦值運算子,關係運算子,相等運算子,三元運算子,運算子的優先順序,程式碼塊)(十)JavaScript賦值
- php運算子運用之型別運算子該如何使用PHP型別
- Python學習-算術運算子,賦值運算子和複合運算子Python賦值
- Python 運算子優先順序 運算子Python
- C++ 迭代器運算子 箭頭運算子->C++
- 《前端運維》一、Linux基礎--05Shell運算子前端運維Linux
- JavaScript /= 運算子JavaScript
- JavaScript += 運算子JavaScript
- JavaScript -= 運算子JavaScript
- JavaScript *= 運算子JavaScript
- JavaScript %= 運算子JavaScript
- JavaScript |= 運算子JavaScript
- JavaScript <<= 運算子JavaScript
- JavaScript >>>= 運算子JavaScript
- JavaScript >>= 運算子JavaScript
- JavaScript &= 運算子JavaScript
- JavaScript ^= 運算子JavaScript
- JavaScript in 運算子JavaScript
- Java 運算子Java
- Java運算子Java
- js運算子JS
- oracle運算子Oracle
- JavaScript:運算子JavaScript