文本處理工具之AWK
一、linux文本處理工具三劍客:grep 、sed、 awk。其中grep是一種文本過濾器,sed是文本行編輯器,而awk是一種報表生成器,就是對文件進行格式化處理的,這里的格式化不是文件系統的格式化,而是對文件內容進行各種“排版”,進而格式化顯示。
在linux上我們使用的是GNU awk 簡稱 gawk,并且gawk是awk的鏈接文件,因此在系統上使用gawk和awk效果一樣
二、awk的工作原理
awk在處理文本時也是一次讀取一行文本,然后根據輸入分隔符(默認分隔符為空格符)進行切片,切成n個片,然后將每一片都富裕awk內部的一個變量當中來進行保存,這些變量名為$1,$2,$3,…,$n。awk就可以對這些切片進行單獨處理,比如顯示某一段,還可以對某些短進行額外的加工處理,比如計數、運算等。
三、awk的基本用法
1、 awk [options] ‘program’ var=value file…
awk [options] -f programfile var=value file…
awk [options] ‘BEGIN{ action;… } pattern{ action;… } END{action;… }’ file …
2、awk 程序通常由: BEGIN語句塊、能夠使用模式匹配的通用語句塊、 END語句塊,共三部分組成
3、program:編程語言,通常是被單引號或雙引號中
(1) program:pattern{action statements;..}
(2) pattern:模式部分決定動作語句何時觸發及觸發事件
(3)action statements對數據進行處理,放在{}內指明
4、選項
-F :指明輸入字段分隔符(默認分隔符為空格符)
-v :變量賦值
-f :讀取awk腳本并執行
四、pattern:根據pattern條件,過濾匹配的行,再做處理
(1)如果未指定:空模式,匹配每一行
(2)/regular expression/:僅處理能夠模式匹配到的行,需要用/ /括起來
(3) relational expression: 關系表達式,結果為“真”才會被處理
真:結果為非0值,非空字符串
假:結果為空字符串或0值
(4)#,# :行范圍,類似sed或vim中的地址界定
(5)BEGIN 、END:兩種特殊的模式
BEGIN語句塊在awk開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通??梢詫懺贐EGIN語句塊中
END語句塊在awk從輸入流中讀取完所有的行之后即被執行,比如打印所有行的分析結果這類信息匯總都是在END語句塊中完成,它也是一個可選語句塊
五、變量:內置和自定義變量
1、內置變量
FS:輸入字段分隔符,默認為空白字符
OFS:輸出字段分隔符,默認為空白字符
RS:輸入記錄分隔符,指定輸入時的換行符,原換行符仍有效
ORS:輸出記錄分隔符,輸出時用指定符號代替換行符
NF:字段數量
NR:行號
FNR:各文件分別計數,行號
FILENAME:當前文件名
ARGC:命令行參數的個數
ARGV:數組,保存的是命令行所給定的各參數
2、自定義變量
(1) -v var=value
(2) 在program中直接定義
示例:
六、awk的輸出命令
1、print
用法:print item1,item2 …
(1) 逗號分隔符
(2) 輸出的各item可以字符串,也可以是數值;當前記錄的字段、變量或awk的表達式
(3) 如省略item,相當于print $0 ,用于輸出整行
(4) 打印字符串時,要用引號引用
(5)打印變量時候,可以使用變量名直接引用
示例:
2、printf格式化輸出
格式化輸出: printf “ FORMAT” , item1, item2, …
(1) 必須指定FORMAT
(2) 不會自動換行,需要顯式給出換行控制符, \n
(3) FORMAT中需要分別為后面每個item指定格式符
(4)格式符:與item一一對應
%c: 顯示字符的ASCII碼
%d, %i: 顯示十進制整數
%e, %E:顯示科學計數法數值
%f:顯示為浮點數
%g, %G:以科學計數法或浮點形式顯示數值
%s:顯示字符串
%u:無符號整數
%%: 顯示%自身
(5)修飾符:
#[.#]:第一個數字控制顯示的寬度;第二個#表示小數點后精度
-: 左對齊(默認右對齊)
+:顯示數值的正負符號
示例:
七、操作符
1、算術操作符:
x+y, x-y, x*y, x/y, x^y, x%y
-x: 轉換為負數
+x: 轉換為數值
2、字符串操作符:沒有符號的操作符,字符串連接
3、 賦值操作符:
=, +=, -=, *=, /=, %=, ^=,++, —
4、比較操作符:==, !=, >, >=, <, <=
5、模式匹配符: ~:左邊是否和右邊匹配包含 !~:是否不匹配
6、邏輯操作符: 與&&,或||,非!
7、函數調用: function_name(argu1, argu2, …)
8、條件表達式(三目表達式):
selector?if-true-expression:if-false-expression
示例:
八、控制語句
1、if-else語句
語法: if(condition){statement;…}[else statement]
if(condition1){statement1}elseif(condition2){statment2}else{statement3}
示例:
2、while 語句
語法: while(condition){statement;…}
條件“真”,進入循環;條件“假”, 退出循環
示例:
3、for 語句
語法: for(expr1;expr2;expr3) {statement;…}
常見用法:
for(variable assignment;condition;iteration process){for-body}
特殊用法:能夠遍歷數組中的元素;
for(var in array) {for-body}
示例:統計當前系統上所有tcp連接的各種狀態的個數
4、do-while循環
語法: do {statement;…}while(condition)
意義:無論真假,至少執行一次循環體
示例:計算1到100的和
5、switch語句
語法: switch(expression) {case VALUE1 or /REGEXP/:statement1; case VALUE2 or /REGEXP2/: statement2;…; default: statementn}
6、break和continue
示例:
7、next
提前結束對本行處理而直接進入下一行處理
示例:利用next打印奇數行
九、數組
關聯數組: array[index-expression]
(1)可使用任意字符串;字符串要使用雙引號括起來
(2)如果某數組元素事先不存在,在引用時, awk會自動創建此元素,并將其值初始化為“空串”
(3)若要判斷數組中是否存在某元素,要使用“index in array”格式進行遍歷
若要遍歷數組中的每個元素,要使用for循環
for(var in array) {for-body}
注意: var會遍歷array的每個索引
示例:統計訪問httpd服務的每個客戶的次數
十、函數
1、內建函數
rand():返回0和1之間一個隨機數
length([s]):返回指定字符串的長度
sub(r,s,[t]):對t字符串進行搜索r表示的模式匹配的內容,并將第一個匹配的內容替換為s
gsub(r,s,[t]):對t字符串進行搜索r表示的模式匹配的內容,并全部替換為s所表示的內容
split(s,array,[r]):以r為分隔符, 切割字符串s,并將切割后的結果保存至array所表示的數組中,第一個索引值為1,第二個索引值為2,…
2、自定義函數
格式:
function name ( parameter, parameter, … ) {statemente return expression}
十一、awk中調用shell命令
system命令
空格是awk中的字符串連接符,如果system中需要使用awk中的變量可以使用空格分隔,或者說除了awk的變量外其他一律用””引用起來。
十二、幾個awk練習
1、利用awk打印九九乘法表
2、提取字符串“hy3yg4gyh6jh@$$6jhj7mkkjn+24hij” 中的數字
原創文章,作者:zq,如若轉載,請注明出處:http://www.www58058.com/76592