> pattern的細化
首先說下BEGIN和END之間的多個模式的執行順序,我寫了下面的程式來驗證下:
圖1 多個模式的執行順序驗證(資料檔案為cars)
如,BEGIN,END中間有三個模式,預設模式,判斷出廠時間($3>2000),判斷品牌($1 ~ /ford/),運行結果如下:
圖2 運行結果
可見,對資料檔案中的一條記錄,gawk的多個檔案是依次匹配的。
· pattern中用到的文法和運算子:
1、Regex
1中看到的,用 / / 將Regex括起來,即可將該運算式作為模式使用:
單獨的“ /ford/ ” 表示用該運算式匹配整個記錄
也可以至少用“ ~ ”,如“$1 ~ /ford/”,表示指定欄位作為匹配對象,匹配對象可以是欄位,也可以使變數。
“!~ ”表示不滿足匹配。
2、關係操作符
可以使用<,<=,==,!=,>=,> 等關係操作符進行數值和字串比較
3、布林運算子
可以使用 ||(OR)和&&(AND)來組合任何模式
· 特殊符號
, (逗號)
範圍操作符 如果一個gawk程式行上用逗號將兩個模式隔開,
gawk選取從匹配第1個模式的第1行開始的文本行。
gawk選取的最後一行是匹配第2個模式的那行緊接著的下一行文本。如果沒有匹配第2個模式的文本航,gawk將選取知道輸入末尾的所有文本行。
在gawk找到第2個模式之後,它將再次尋找第1個模式以再次開始這個過程。
eg.
圖3 cars資料檔案
圖4 逗號算符樣本1
圖5 逗號算符樣本2
看樣本1,“awk '/volvo/,/bmw/' cars”, 先匹配/volvo/,從第4行開始,匹配成功,然後要匹配/bmw/,到第7行。然後,重新開始匹配/volvo/,找不到,到檔案末尾,結束。
樣本2,“awk '/chevy/,/ford/' cars”,先匹配/chevy/,從第一行開始,匹配成功,然後匹配/ford/,第一組取到2、3行資料,又從/chevy/開始,雖然cars中第5行為ford,但是現在匹配的是/chevy/,所以被跳過了。可見,逗號分隔的兩個匹配,是有先後順序的。
> 幾個特殊符號
單引號'
在命令列上建立的gawk程式中間包含空格或特殊的shell字元,則必須用單引號將程式括起來。
gawk寫在shell檔案中時:
單引號用來從shell中擷取變數值
圖6 單引號樣本
雙引號"
使用了雙引號,gawk將進行本文比較,即使用ASCII排序序列作為比較基礎
圖7 雙引號樣本
如果是進行數值比較,則不用雙引號
圖8 數值比較