1. 程式人生 > >awk——報告生成器

awk——報告生成器

awk

文本處理三劍客——grep,awk,sed;grep是基於pattern過濾輸出,有三種模式,grep,egrep以及fgrep;sed則是一種流編輯器,進行插入刪除,常用於進行文本中的替換操作;而awk的功能就更加強大了,作為一種格式化文本工具,awk通過分隔符控制文本,awk默認的分隔符是空格;awk還可以通過pattern匹配按行進行遍歷,通過算術表達式對行進行排查,還可以for,while,continue,break等控制語句找到符合條件的信息進行輸出;他還可以對輸出的結果進行修飾采用printf的輸出方式,控制格式;

awk其實就是gawk,他是通過從gawk鏈接過來的一個命令,使用man awk時出現的也是gawk的內容;這是因為以前的人一直使用awk成為了習慣,所以特地配置了這個命令的鏈接;

awk基本格式

awk [options] ‘program‘ file ...

program:pattern{action statements;...}

pattern:pattern在awk中有很多種類,其中典型的是在執行awk命令時首先需要執行的 pattern還可以執行正常環境下的pattern語法,不過需要用“//”包含;

action:print,printf兩種,print作為正常的輸出,輸出匹配的字段,awk命令是一種基 於分隔符的形式來操作的命令,會將當前字段分隔為$1,$2,$3...$NF;由print來輸出;printf 則可以在輸出字段的同時,對字段進行格式規整的操作;

awk執行流程:

①首先執行BEGIN{}語句段,一段用於在數據前方起到一個開頭的作用;

②讀取指定文件中的每一行數據,按行遍歷,根據我們提供的pattern值進行匹配,若想輸出匹配 到的pattern數據,則print本身,不需要加字段$1,$2這些,如awk ‘$3>500{print}‘ /filepath;這 樣就只輸出$3這個字段中大於500的行數據了;

③執行END{}語句段;

awk:

常用選項:

-F:指定字段分割符;

-v:手動設置變量;var=value;

1.awk中的變量:

awk中的變量有兩種,一種是自建變量,即用-v選項指定變量名,或者在語句塊中直接聲明使用;

另一種則是awk這個命令中的內建變量了;

內建變量:

FS:相當於-F選項的設置輸入分隔符;

如:使用FS指定“:”作為字段分隔符;

技術分享

OFS:設置輸出分隔符,在輸出的數據進行分隔,默認是空白字符;

如:

技術分享

NF:字段數量,$NF作為輸出的最後一個字段,而NF則輸出這個字段的序列號;

如:$NF

技術分享

NF

技術分享

NR:awk遍歷行時輸出每行的行號;在END{}語句塊使用時則輸出awk遍歷的這個文件的總行數;可 以將兩個文件合起來一起統計行數,只要在文件路徑處再加一個路徑即可;這樣統計出來的就是總 的行數;

如:

技術分享

FNR:file number of record,分別統計各個文件的行數,行號;這樣統計出來的就是兩個文件 分別的行數

FILENAME:輸出當前處理的文件名;

如:

技術分享

ARGC:輸出命令行中參數的個數;

如:

技術分享

該段命令中的參數是awk,以及後面的文件路徑

ARGV:以數組的形式保存命令行中參數的內容;

如:

技術分享

2.printf:格式化輸出結果

printf這個action,除了具備print的功能之外,他還可以為每個輸出的量固定格式,固定其字符串長度,左右對齊,顯示整數或浮點數等;

printf "format",item,item

format必須符合要求,且每一個item都需要對應一個模式,即一種format,format需要用雙引號括起來;

format的格式與類型:

以%開頭,後跟這個item類型

格式符:

%c:顯示字符的ASCII碼;

%d,%i:顯示十進制整數;

%f:顯示浮點數字;

%e,%E:使用科學計數法顯示數字;

%g,%G:使用科學計數法顯示浮點數字;

%s:顯示字符串;

%u:顯示無符號整數;

%%:顯示%自己;

常用的是%s,%d等;當需要指定字符串長度時,直接在%後加字符串長度,如%10s,表示10個字節字符串;

-:表示向左對齊,默認是向右對齊;

+:顯示數字的正負符號;

如%-10s,%+10s

示例:

技術分享


3.操作符

①算術操作符

如 +,-,*,^,/,%

-x:將正數轉化為負數;

+x:將字符串轉化為數值;

如:x%y

技術分享

②賦值操作符:

=,+=,-=,*=,/=,%=,^=

++,--

用法同上

③比較操作符:

>,>=,<,<=,==,!=

如:找到UID大於500的用戶信息

技術分享

④模式匹配操作符:

~:左邊的字符串是否與右邊的pattern匹配;

!~:左邊的字符串是否與右邊的pattern不匹配;

如:從$NF找到匹配nologin的行

技術分享

⑤邏輯操作符:

與(&&),或(||),非(!)

可以將匹配信息相與或操作,提煉出想要的結果;

如:找到UID大於500小於1000的用戶信息

技術分享

⑥條件表達式:

condition(selector)?if-true-expression:if-false-expression

如:當滿足UID大於500小於1000時,將變量user值設為yes,否則設為no

技術分享

4.pattern

①空pattern:所有的行統一遍歷,不存在匹配值;

②設置pattern,需要用“//”隔開;

如:

技術分享

③設置pattern範圍:/pattern1/,/pattern2/

如:找到開頭為w,到開頭以n的用戶信息

技術分享

④BEGIN{}

BEGIN{}語句塊只有在awk命令執行之前才會實現;通常用於輸出結果的開頭;

如:設置開頭的user UID標題

技術分享

⑤END{}

END{}語句塊只有在awk命令執行結束後才會實現,通常作為這一次命令的總結;

如:END語句塊在尾部生成隔開符號*,並且計算總行數;

技術分享


5.控制語句

如for,while,next,do-while,if-else等;

for循環:

語法:for (expr1;expr2;expr3) statement

expr1:給變量設置初值,如i=1;

expr2:給變量she‘zhi範圍,如i<100;

expr3:執行遞增遞減操作,如i++,i--;

如:使用for循環遍歷一行,讀取一行中每一組分隔字段的長度,使用length內置函數;

技術分享

while循環:為真則進入循環,為假則退出循環;

語法:while (condition) statement

如:

技術分享

do-while循環:原理同while一樣,不同在於,其是執行一遍再判斷是否滿足要求,若不滿足再退出;

語法:do statement while (condition)

如:

技術分享

next:當滿足條件時則提前退出本次循環,進入下一次循環;

如:

技術分享

break:當滿足條件時則退出循環;

如:

技術分享

continue:當滿足條件時,則直接跳過本次循環,進行下一次循環;

同上;


6.數組:

awk中的數組有兩個特性

①當數組本身不存在,卻引用這個數組時,會將數組的值設為空字符串,相當於0;

②數組可以用字符串來表示,但字符串需要加雙引號,如a["letter"];

引用數組

如:

技術分享

查看一個設定好的文件中的單詞的個數,使用for循環的s in array的形式:

如:

技術分享

awk——報告生成器