shell学习笔记3---awk的执行过程(原创)
awk_script的組成
1、awk_script可以由一條或多條awk_cmd組成,兩條awk_cmd之間一般以NEWLINE分隔
2、awk_cmd由兩部分組成: awk_pattern { actions }
3、awk_script可以被分成多行書寫,必須確保整個awk_script被單引號括起來。
awk命令的一般形式
awk ' BEGIN { actions }
awk_pattern1 { actions }
............
awk_patternN { actions }
END { actions }
' inputfile
其中 BEGIN { actions } 和 END { actions } 是可選的。
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 1
b 2
$ cat file2
d 4
c 3
$ awk '{print $0} {print $1}' file1 file2
a 1
a
b 2
b
d 4
d
c 3
c
另外有以下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 { actions } ,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 {print "ok"}' input_file
awk '$3 ~ /^d/ {print "ok"}' input_file
3、&&(與) 和 ||(或) 可以連接兩個/regexp/或者布爾表達式,構成混合表達式。!(非) 可以用于布爾表達式或者/regexp/之前。
舉例
awk '($1 < 10 ) && ($2 > 10) {print "ok"}' input_file
awk '/^d/ || /x$/ {print "ok"}' input_file
4、其它表達式用作awk_script,如賦值表達式等
eg:
awk '(tot+=$6); END{print "total points :" tot }' input_file?? ? // 分號不能省略
awk 'tot+=$6 {print $0} END{print "total points :" tot }' 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函數可以參見筆者的另一篇博客
http://czmmiao.iteye.com/blog/1885572
awk的語句: awk的語句主要是賦值語句,用來給變量賦值。
1、把直接值或一個變量值賦值給變量。如果直接值是字符串要加雙引號。
舉例
awk 'BEGIN {x=1 ; y=3 ; x=y ; print "x=" x " ; y=" y }'
2、把一個表達式的值賦值給變量。表達式一般是數值表達式,也可以是其它表達式。
數值表達式: num1 operator num2
operator可以是: +(加) -(減) *(乘) /(除) %(取模) ^(求冪)
當num1或者num2是字符串而是不是數字時,無論是否加有雙引號,awk都視其值為0
條件選擇表達式: A?B:C (A為布爾表達式,B和C可以是表達式或者直接值)
當布爾表達式A的值為真時,整個表達式的值為B,A的值為假時,整個表達式的值為C
舉例
awk 'BEGIN {x=3 ; x+=2 ; y=x+2 ; print "x=" x " ; y=" y }'
awk 'BEGIN {x=3 ; y=x>4?"ok":4 ; print "x=" x " ; y=" y }'
3、為了方便書寫,awk也支持C語言語法的賦值操作符: += -= *= /= %= ^= ++ --
流程控制結構
其中condition一般為布爾表達式,body和else-body是awk語句塊。
1、if (condition) {then-body} [else {else-body}]
2、while (condition) {body}
3、do {body} while (condition)
4、for (initialization; condition; increment) {body}
與C語言的for結構的語法相同。
5、break : 跳出包含它的for、while、do-while 循環
6、continue : 跳過for、while、do-while循環的body的剩余部分,而立刻進行下一次循環的執行。
?
參考至:http://blog.chinaunix.net/uid-46353-id-2399597.html
????????????????? http://blog.sina.com.cn/s/blog_6f02e1900100mmc5.html
本文原創,轉載請注明出處、作者
如有錯誤,歡迎指正
郵箱:czmcj@163.com
總結
以上是生活随笔為你收集整理的shell学习笔记3---awk的执行过程(原创)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移动端网页特效:左右滑动开关
- 下一篇: 使用xshell 登陆aws的ec2