Linux文本處理三劍客之-awk

awk是一款強大的報告生成器,不同於sed和grep,它的側重點是如何把文本信息更好的展示出來,常用與統計和格式化輸出。awk相當於微型的shell,有着自己一套語法結構,例如:循環結構,數組,條件判斷,函數,內置變量等功能。處理對象一般純文本文件或純文本信息。在開源界的awk是gawk(GNU)。在Linux中常使用的gawk,但是一般都稱之爲awk。

awk處理文本的過程如下:

1

基本的語法結構如下:

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 ""(默認會回車換行);

2

$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表示精度

3

2、awk變量

awk常見的變量有內置變量和自定義變量

2.1 內置變量

下面說明常見的內置變量


FS:Field Seperator, 輸入時的字段分隔符,功能等價於參數-F。(注意下圖字符串的連接)

OFS: Output Field Seperator, 輸出時的字段分隔符;(默認是空格)

5

RS:Record Seperator, 輸入行分隔符

ORS: Outpput Row Seperator, 輸出時的行分隔符;

6

NF:Numbers of Field,字段數

NR:Numbers of Record, 行數;所有文件的一併計數;

7

FNR:行數;各文件分別計數;

8

ARGV:數組,保存命令本身這個字符,awk '{print $0}' 1.txt 2.txt,意味着ARGV[0]保存awk,

ARGC: 保存awk命令中參數的個數;

這2個變量類似於C語言中的可變參函數編程,將參數本身和參數個數保存起來,以便調用

9 

FILENAME: awk正在處理的當前文件的名稱;

10

2.2 用戶自定義變量

用戶自定義變量可以定義在任何位置。在options中定義的話,可以使用-v參數。

ps:在BEGIN模式下定義變量的時候,注意要用“”問題。

11

3、awk模式

(1) Regexp: 格式爲/PATTERN/  處理被/PATTERN/匹配到的行;

12

(2) Expression: 表達式,其結果爲非0或非空字符串時滿足條件;僅處理滿足條件的行;

13

(3) Ranges: 行範圍,此前地址定界,startline, endline   僅處理範圍內的行,startline和endline使用模式

14 

單詞錨定也可以使用如下方式:

17

(4) BEGIN/END: 特殊模式,僅在awk命令的program運行之前(BEGIN)或運行之後(END)執行一次;

15

(5) Empty:空模式,匹配任意行;

4、awk的控制語句

4.1 if-else

格式:if (condition) {then body} else {else body}

16 

4.2 while

格式:while (condition) {while body} ,這裏的循環指的是在循環field。

18

4.3 do-while循環

格式:do {do-while body} while (condition) ,執行過程是先進入循環,執行一次,在進行條件判斷。其他的同while一樣。

4.4 for循環

格式:for (variable assignment; condition; iteration process) {for body}

19

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默認情況下是會對行循環的)

20 

5、數組

用到最多的是關聯數組,在統計數據時用到的會比較多。 數組使用時無需事先定義,可以直接使用。如果某數組元素事先不存在,那麼在引用時,awk會自動創建此元素並將其初始化爲空串。

所謂,關聯數組是數組的下標可是任意的字符。如果使用數字作爲數字的下標的話,一般從1開始。

要遍歷數組中的每一個元素,需要使用如下特殊結構:

for (var in array) {for body}

其var會遍歷array的索引; 遍歷的時候是隨機的,不是按照特定的順序

21

刪除數組元素:

delete array[index]

6、awk的內置函數

split(string,array[,fieldsep[,seps]]) 功能:將string表示的字符串以fieldsep爲分隔符進行切片,並切片後的結果保存至array爲名的數組中;數組下標從1開始; 此函數有返回值,返回值爲切片後的元素的個數

length(string) 功能:返回給定字串的長度。如果string是數組名,返回的是數組的長度

23 

substr(string,start[,length]) 功能:從string中取子串,從start爲起始位置爲取length長度的子串;

24 

system(”shell 命令字符串”)函數:執行shell命名

26

7、awk的操作符

算術操作符:+、-、*、/、%

字符串操作符:字符串之間可以實現無縫連接。

賦值操作符:=、+=、-=、*=、/=、%=、**=

增強運算符:++、 --

如果模式自身是=號,要寫爲/=/

比較操作符: <、<=、>、>=、==、!=

~:模式匹配,左邊的字符串能夠被右邊的模式所匹配爲真,否則爲假;!~: 模式取反

邏輯操作符:&&: 與 ||:或

條件表達式:selector?if-true-expression:if-false-expression(三目運算符)

25

函數調用:function_name(argu1,argu2),當然用戶也可以自定函數使用。

至此,awk的基本用法就介紹完成了,更多高級的用法可以通過man手冊和官方文檔


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章