awk是一款強大的報告生成器,不同於sed和grep,它的側重點是如何把文本信息更好的展示出來,常用與統計和格式化輸出。awk相當於微型的shell,有着自己一套語法結構,例如:循環結構,數組,條件判斷,函數,內置變量等功能。處理對象一般純文本文件或純文本信息。在開源界的awk是gawk(GNU)。在Linux中常使用的gawk,但是一般都稱之爲awk。
awk處理文本的過程如下:
基本的語法結構如下:
awk [options] ‘PATTERN{action}’ file1 file2 …
下面從不同角度來說明,awk的用法。
1、awk的輸出
常用的2個輸出函數是print,printf函數,用於格式化輸出。
1.1 print
print函數用法: print item1,item2,…
要點:
(1) 各項目之間使用逗號分隔,而輸出時則使用輸出分隔符(ORS)分隔,默認是空格;
(2) 輸出的各item可以字符串或數值、當前記錄的字段、變量或awk的表達式;數值會被隱式轉換爲字符串後輸出;
(3) print後面item如果省略,相當於print $0;輸出空白,使用pirnt ""(默認會回車換行);
$1,$7是以:爲分隔符的第一個字段和第一個字段(Field),$0表示整行信息。
1.2 printf
printf函數用法: print format item1,item2,… 類似C語言中的printf函數。
要點:
(1) 要指定format;
(2) 不會自動換行;如需換行則需要給出\n
(3) format用於爲後面的每個item指定其輸出格式;
format格式一般都以%開頭,常見的有:
%c | 顯示字符ASCII碼值 |
%d %i | 十進制的整數 |
%e %E | 以科學計數法顯示數值 |
%f %lf | 顯示浮點數 |
%g,%G | 以科學計數法或浮點數顯示數值 |
%s | 顯示字符串 |
%u | 顯示無符號整形 |
%% | 顯示%本身 |
格式也有修飾符,常見的修飾符有:
n(數字):顯示寬度
-:左對齊,默認是由對齊
+:顯示數值的符號
n1.n2:n1表示長度,n2表示精度
2、awk變量
awk常見的變量有內置變量和自定義變量
2.1 內置變量
下面說明常見的內置變量
FS:Field Seperator, 輸入時的字段分隔符,功能等價於參數-F。(注意下圖字符串的連接)
OFS: Output Field Seperator, 輸出時的字段分隔符;(默認是空格)
RS:Record Seperator, 輸入行分隔符
ORS: Outpput Row Seperator, 輸出時的行分隔符;
NF:Numbers of Field,字段數
NR:Numbers of Record, 行數;所有文件的一併計數;
FNR:行數;各文件分別計數;
ARGV:數組,保存命令本身這個字符,awk '{print $0}' 1.txt 2.txt,意味着ARGV[0]保存awk,
ARGC: 保存awk命令中參數的個數;
這2個變量類似於C語言中的可變參函數編程,將參數本身和參數個數保存起來,以便調用
FILENAME: awk正在處理的當前文件的名稱;
2.2 用戶自定義變量
用戶自定義變量可以定義在任何位置。在options中定義的話,可以使用-v參數。
ps:在BEGIN模式下定義變量的時候,注意要用“”問題。
3、awk模式
(1) Regexp: 格式爲/PATTERN/ 處理被/PATTERN/匹配到的行;
(2) Expression: 表達式,其結果爲非0或非空字符串時滿足條件;僅處理滿足條件的行;
(3) Ranges: 行範圍,此前地址定界,startline, endline 僅處理範圍內的行,startline和endline使用模式
單詞錨定也可以使用如下方式:
(4) BEGIN/END: 特殊模式,僅在awk命令的program運行之前(BEGIN)或運行之後(END)執行一次;
(5) Empty:空模式,匹配任意行;
4、awk的控制語句
4.1 if-else
格式:if (condition) {then body} else {else body}
4.2 while
格式:while (condition) {while body} ,這裏的循環指的是在循環field。
4.3 do-while循環
格式:do {do-while body} while (condition) ,執行過程是先進入循環,執行一次,在進行條件判斷。其他的同while一樣。
4.4 for循環
格式:for (variable assignment; condition; iteration process) {for body}
for循環可用來遍歷數組元素:
語法:for (i in array) {for body},常用。
4.5 case語句
語法:switch (expression) {case VALUE or /RGEEXP/: statement1;... default: stementN},同C語言的case語句類似的格式。
4.6 循環控制
break 跳出本層循環
continue 直接進入到下一次循環中
4.7 next
提前結束對本行的處理進而進入下一行的處理;功能等價於contine(awk默認情況下是會對行循環的)
5、數組
用到最多的是關聯數組,在統計數據時用到的會比較多。 數組使用時無需事先定義,可以直接使用。如果某數組元素事先不存在,那麼在引用時,awk會自動創建此元素並將其初始化爲空串。
所謂,關聯數組是數組的下標可是任意的字符。如果使用數字作爲數字的下標的話,一般從1開始。
要遍歷數組中的每一個元素,需要使用如下特殊結構:
for (var in array) {for body}
其var會遍歷array的索引; 遍歷的時候是隨機的,不是按照特定的順序
刪除數組元素:
delete array[index]
6、awk的內置函數
split(string,array[,fieldsep[,seps]]) 功能:將string表示的字符串以fieldsep爲分隔符進行切片,並切片後的結果保存至array爲名的數組中;數組下標從1開始; 此函數有返回值,返回值爲切片後的元素的個數
length(string) 功能:返回給定字串的長度。如果string是數組名,返回的是數組的長度
substr(string,start[,length]) 功能:從string中取子串,從start爲起始位置爲取length長度的子串;
system(”shell 命令字符串”)函數:執行shell命名
7、awk的操作符
算術操作符:+、-、*、/、%
字符串操作符:字符串之間可以實現無縫連接。
賦值操作符:=、+=、-=、*=、/=、%=、**=
增強運算符:++、 --
如果模式自身是=號,要寫爲/=/
比較操作符: <、<=、>、>=、==、!=
~:模式匹配,左邊的字符串能夠被右邊的模式所匹配爲真,否則爲假;!~: 模式取反
邏輯操作符:&&: 與 ||:或
條件表達式:selector?if-true-expression:if-false-expression(三目運算符)
函數調用:function_name(argu1,argu2),當然用戶也可以自定函數使用。
至此,awk的基本用法就介紹完成了,更多高級的用法可以通過man手冊和官方文檔