Linux文本處理三劍客之-awk

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

awk處理文本的過程以下:express

1

基本的語法結構以下:編程

awk [options] ‘PATTERN{action}’ file1 file2 …數組

下面從不一樣角度來講明,awk的用法。ide

一、awk的輸出

經常使用的2個輸出函數是print,printf函數,用於格式化輸出。函數

1.1 print

print函數用法: print item1,item2,…spa

要點:3d

(1) 各項目之間使用逗號分隔,而輸出時則使用輸出分隔符(ORS)分隔,默認是空格;orm

(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

二、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

三、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:空模式,匹配任意行;

四、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 

五、數組

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

所謂,關聯數組是數組的下標但是任意的字符。若是使用數字做爲數字的下標的話,通常從1開始。

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

for (var in array) {for body}

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

21

刪除數組元素:

delete array[index]

六、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

七、awk的操做符

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

字符串操做符:字符串之間能夠實現無縫鏈接。

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

加強運算符:++、 --

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

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

~:模式匹配,左邊的字符串可以被右邊的模式所匹配爲真,不然爲假;!~: 模式取反

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

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

25

函數調用:function_name(argu1,argu2),固然用戶也能夠自定函數使用。

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

相關文章
相關標籤/搜索