shell學習筆記3 awk的執行過程 原創

2021-09-23 19:37:58 字數 3843 閱讀 5160

awk_script的組成

1、awk_script可以由一條或多條awk_cmd組成,兩條awk_cmd之間一般以newline分隔

2、awk_cmd由兩部分組成: awk_pattern

3、awk_script可以被分成多行書寫,必須確保整個awk_script被單引號括起來。

awk命令的一般形式

awk ' begin

awk_pattern1

............

awk_patternn

end

' inputfile

其中 begin 和 end 是可選的。

awk的執行過程

1、如果begin 區塊存在,awk執行它指定的actions。

2、awk從輸入檔案中讀取一行,稱為一條輸入記錄。如果輸入檔案省略,將從標準輸入讀取

3、awk將讀入的記錄分割成欄位,將第1個字段放入變數$1中,第2個字段放入$2,以此類推。$0表示整條記錄。字段分隔符使用shell環境變數fs或由引數指定。

4、把當前輸入記錄(資料行)依次與每乙個awk_cmd中awk_pattern比較,看是否匹配,如果相匹配,就執行對應的actions。如果不匹配,就跳過對應的actions,直到比較完所有的awk_cmd。

5、當一條輸入記錄比較了所有的awk_cmd後,awk讀取輸入的下一行,繼續重複步驟3和4,這個過程一直持續,直到awk讀取到檔案尾。

6、當awk讀完所有的輸入行後,如果存在end,就執行相應的actions。

其中iput_file可以是多於乙個檔案的檔案列表,awk將按順序處理列表中的每個檔案。awk會先對輸入檔案執行完所有的action後再處理下乙個檔案,看如下例子

$ cat file1

a 1b 2

$ cat file2

d 4c 3

$ awk ' ' file1 file2

a 1a

b 2b

d 4d

c 3c

另外有以下4點需要注意:

1、一條awk_cmd的awk_pattern可以省略,省略時不對輸入記錄進行匹配比較就執行相應的actions。一條awk_cmd的actions也可以省略,省略時預設的動作為列印當前輸入記錄(print $0) 。一條awk_cmd中的awk_pattern和actions不能同時省略。

2、begin區塊和end區塊別位於awk_script的開頭和結尾。awk_script中只有end區塊或者只有begin區塊是被允許的。如果awk_script中只有begin ,awk不會讀取input_file。

3、awk把輸入檔案的資料讀入記憶體,然後操作記憶體中的輸入資料副本,awk不會修改輸入檔案的內容。

4、awk的總是輸出到標準輸出,如果想讓awk輸出到檔案,可以使用重定向。

awk_pattern

awk_pattern模式部分決定actions動作部分何時觸發及觸發actions。awk_pattern可以是以下幾種型別:

正規表示式用作awk_pattern: /regexp/

1、awk中正規表示式匹配操作中經常用到的字元:

^ $ . | () * // 通用的regexp元字元

+ : 匹配其前的單個字元一次以上,是awk自有的元字元,不適用於grep或sed等

? : 匹配其前的單個字元1次或0次,是awk自有的元字元,不適用於grep或sed等

2、舉例:

awk '/ *$0.[0-9][0-9].*/' input_file

布林表示式用作awk_pattern,表示式成立時,觸發相應的actions執行。

1、表示式中可以使用變數(如欄位變數$1,$2等)和/regexp/

2、布林表示式中的操作符:

關係操作符: < > <= >= == !=

匹配操作符: value ~ /regexp/ 如果value匹配/regexp/,則返回真;value !~ /regexp/ 如果value不匹配/regexp/,則返回真

舉例:

awk '$2 > 10 ' input_file

awk '$3 ~ /^d/ ' input_file

3、&&(與) 和 ||(或) 可以連線兩個/regexp/或者布林表示式,構成混合表示式。!(非) 可以用於布林表示式或者/regexp/之前。舉例

awk '($1 < 10 ) && ($2 > 10) ' input_file

awk '/^d/ || /x$/ ' input_file

4、其它表示式用作awk_script,如賦值表示式等

eg:awk '(tot+=$6); end' input_file     // 分號不能省略

awk 'tot+=$6 end' input_file // 與上面等效

actions

actions就是對awk讀取的記錄資料進行的操作。actions由一條或多條語句或者命令組成,語句、命令之間用分號(;)分隔。actions中還可以使用流程控制結構的語句。

awk的命令:

1、print 引數列表 : print可以列印字串(加雙引號)、變數和表示式,是awk最基本的命令。引數列表要用逗號(,)分隔,如果引數間用空格分隔,列印出時引數值之間不會有空格。

2、printf ([格式控制符],引數) : 格式化列印命令(函式),語法與c語言的printf函式類似。

3、next : 強迫awk立刻停止處理當前的記錄,而開始讀取和處理下一條記錄,改變指令碼控制過程。

4、nextfile : 強迫awk立刻停止處理當前的輸入檔案而處理輸入檔案列表中的下乙個檔案

5、exit : 使awk停止執行而跳出。如果有end 存在,awk會去執行end 的actions。

6、getline:讀取下一行資料,但不改變指令碼控制過程。

關於exit,next和getline函式可以參見筆者的另一篇部落格

awk的語句: awk的語句主要是賦值語句,用來給變數賦值。

1、把直接值或乙個變數值賦值給變數。如果直接值是字串要加雙引號。舉例

awk 'begin '

2、把乙個表示式的值賦值給變數。表示式一般是數值表示式,也可以是其它表示式。

數值表示式: num1 operator num2

operator可以是: +(加) -(減) *(乘) /(除) %(取模) ^(求冪)

當num1或者num2是字串而是不是數字時,無論是否加有雙引號,awk都視其值為0

條件選擇表示式: a?b:c (a為布林表示式,b和c可以是表示式或者直接值)

當布林表示式a的值為真時,整個表示式的值為b,a的值為假時,整個表示式的值為c舉例

awk 'begin '

awk 'begin '

3、為了方便書寫,awk也支援c語言語法的賦值操作符: += -= *= /= %= ^= ++ --

流程控制結構

其中condition一般為布林表示式,body和else-body是awk語句塊。

1、if (condition) [else ]

2、while (condition)

3、do while (condition)

4、for (initialization; condition; increment)

與c語言的for結構的語法相同。

5、break : 跳出包含它的for、while、do-while 迴圈

6、continue : 跳過for、while、do-while迴圈的body的剩餘部分,而立刻進行下一次迴圈的執行。

參考至:

如有錯誤,歡迎指正

awk學習筆記 3

內建函式 sub 正規表示式,替換串 sub 正規表示式,替換串,目標串 說明 如果不指定目標串,則預設在記錄中查詢能夠匹配正規表示式的最長且最靠左的子串,然後用替換串取代找到的子串。如果指定了目標串,就在目標串中查詢並替換。gsub 正規表示式,替換串 gsub 正規表示式,替換串,目標串 說明 ...

SHELL學習筆記(3)

文字處理工具 1 排序文字 sort sort lines of text files b,ignore leading blanks ignore leading blanks d,dictionary order consider only blanks and alphanumeric cha...

運放學習筆記3 運放指標

1.1 定義 保證運算放大器正常工作的最大輸入電壓範圍,也稱為共模輸入電壓範圍。1.2 軌到軌輸入 當運放最大輸入電壓範圍與電源範圍比較接近時,比如相差 0.1v 甚至相等 超過,都可以叫 輸入軌至軌 表示為 rail to rail input,或 rri。注 運放的兩個輸入端,任何乙個的輸入電壓...