AWK可以說是一種語言,他有著自己的語法,可以實現函數定義,變量賦值,條件選擇(循環,判斷,選擇)…總之是值得深入研究一下的。
AWK的起源:是個報告生成器,可以格式化文本輸出內容,它的命名是由Aho,Weinberger,Kernighan三位作者首字母組合而成的,他有多個版本:New awk(nawk),GNU awk(gawk)。
gawk稱為模式掃描和處理語言,它的基本用法如下:
awk [options] 'program' var=value file…
awk [options] -f programfile var=value file…
awk [options] 'BEGIN{action;…}pattern{action;…}END{action;…}' file
awk程序通常由:BEGIN語句塊,能使用模式匹配的通用語句塊,END語句塊,共三部分
program通常是存放在單引號中
[options]:
-F 指明輸入使用道德字段分隔符
-v var=value:自定義變量
pattern和action:
a.pattern部分決定動作語句何時觸發及觸發事件(BEGIN,END)
b.action statements對數據進行處理,放在{}內指明(print,printf)
分隔符,域和記錄:
1.awk執行時,由分隔符分割的字段(域)標記$1,$2…$n稱為域標識,$0為所有域
注意:和shell中變量$符含義不同
2.文件的每一行稱為記錄
3.省略action,則默認執行print $0操作
awk工作原理:
STEP1:執行BEGIN{action;…}語句塊中的語句
STEP2:從文件或標準輸入(stdin)讀取一行,然后執行pattern{action;…}語句塊,他逐行掃描文件,從第一行到最后一行重復這個過程,知道文件全部被讀取完畢
STEP3:當讀至輸入流末尾時,執行END{action;…}語句塊
BEGIN語句塊在awk開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,比如變量初始化,打印輸出表格的表頭等語句通常卸載BEGIN語句塊中
END語句塊在awk從輸入流中讀取玩完所有的行之后即被執行,比如打印所有行的分析結果這類信息匯總都是在END語句塊中完成,他也是可選語句塊
pattern語句塊中的通用命令是最重要的部分,也是可選的,如果沒有提供pattern語句塊,則默認執行{print},即打印每一個讀取到的行,awk讀取的每一行都會執行該語句塊。
print格式:print item1,item2…
要點:
1)逗號分隔符
2)輸出的各item可以是字符串,也可以是數值,當前記錄的字段,變量或者awk表達式
3)省略item,相當于print $0
awk變量:
變量:內置和自定義變量
FS:輸入字段分隔符,默認為空白字符
OFS:輸出字段分隔符,默認為空白字符
RS:輸入記錄分隔符,指定輸入時的換行符,原換行符仍有效
awk -v RS=' ' '{print }' /etc/passwd
ORS:輸出記錄分隔符,輸出時用指定符號代替換行符
awk -v ORS=' ' '{print }' /etc/passwd
NF:字段數量
awk -F: '{print NF}' /etc/fstab
awk -F: '{print $(NF-1)}' /etc/fstab
NR:顯示行號
行號是每讀一行就顯示該行號,而不是一次性顯示共有多少行
FNR:顯示每個文件的行號,單獨計數
FILENAME:當前文件名
awk '{print FILENAME}' /etc/fstab
ARGC:命令行參數
awk '{print ARGC}' /etc/fstab
結果顯示2,它有兩個參數,第一個參數是awk自身,第二個參數為/etc/fstab
ARGV:數組,保存的是命令行搜給定的各參數
awk 'BEGIN{print ARGV[0]}' /etc/fstab –> awk
AWK變量:
自定義變量
1)-v var=value
變量名區分字符大小寫
2)在program中直接定義
awk 'BEGIN{"name"="awk";print name}'
printf命令:
格式化輸出:printf "FORMAT",item1,item2,…
1)必須指定FORMAT
2)不會自動換行,需要顯示給出換行控制符\n
3)FORMAT中需要分別為后面每個item指定格式符
格式符:與item一一對應
修飾符:
#[.#]:第一個數字控制顯示的寬度,第二個數字表示小數點后的精度,%3.1f
-:左對齊(默認右對齊)%-10s
+:顯示數值的正負符號 %+d
操作符:
算數操作符:
+,-,*,/,%,^
字符串操作符:
沒有符號的操作符,字符串連接
賦值操作符:
=,+=,-=,*=,/=,%=,^=,++,–
比較操作符:
>,>=,<,<=,!=,==
模式匹配符:
~:左邊是否和右邊匹配包含
!~:是否不匹配
邏輯操作符:
awk -F: '$3>=0&&$3<=1000{print $1}' /etc/passwd 顯示所有系統用戶的用戶名
awk -F: '$3==0||$3>1000{print $1}' /etc/passwd 顯示root或者普通用戶
Pattern模式:
根據pattern條件,過濾匹配的行,再做處理
1)如果未指定:空模式,匹配每一行
2)/regular expression/:僅處理能夠模式匹配到的行,需要用/ /括起來
awk '/^root/{print }' /etc/passwd
3) relation expression:關系表達式,結果有真有假,結果為真時才會被處理
真:結果為非0值,非空字符串
假:結果為空字符串
seq 10 | awk 'i=!i'
此執行結果為顯示奇數行,seq 10 生成1~10的序列,i的初始值為0,!i則表示為非0,即為真,這樣第一行就打印出來了,i=!i則i現在值為1,第一行結束,讀第二行,!i,即非1,為假,所以這一行就不輸出了,然后i被賦值為0,然后就這樣繼續循環下去,知道將序列中所有元素都讀完,這樣打印顯示的就是奇數行
4)line ranges:行范圍
startline,endline:/part1/,/part2/不支持直接給出數字格式
awk -F: '/^root/,/^nobody/{print $1,$3}' /etc/passwd
5) BEGIN/END模式
BEGIN{}:僅在開始處理文本中的文本之前執行一次
END{}: 僅在文本處理完成后執行一次
AWK ACTION
常用的action分類:
1)Expression:算術,比較表達式等
2)Control Statements:if,while等
3)Compound Statements:組合語句
4)Input Statements
5)Output Statements:print等
控制語句之if-else
語法:
if(condition)statmement[else statement]
if(condition1){statement1}else if{condition2}{statement2}else{statement3}
使用場景:對awk取得的整行或某個字段做條件判斷
控制語句之while循環
語法:while(condition)statement
條件‘真’,進入循環;條件‘假’,退出循環
使用場景;
對一行內的多個字段逐一類似處理時使用
對數組中的各元素逐一處理時使用
控制語句之do-while循環
語法:do statement while(condition)
意義:無論真假,先執行一次循環體
控制語句之for循環
語法:for(expr1,expr2,expr3…)statement
for(variable assignment;condition;iteration process){for-body}
特殊用法:能夠遍歷數組中的元素
語法:for(var in array){for-body}
參考性能方面的數據,可以知道awk的語句執行效率比其他幾種循環遍歷要高
控制語句之switch
語法:switch(expression){case value1 or /regexp/:statement;case value2 or /regexp2/:statement;…default:statement}
break,continue,next
break是退出循環體:break[n]
continue是退出本次循環,開始新的一輪循環:continue[n]
next提前結束對本行處理而直接進入下一行處理(awk自身循環)
awk -F: '{if($3%2!=0)next;print $1,$3}' /etc/passwd
awk數組
若要遍歷數組中的每一個元素,要使用for循環
for(var in arry){for-body}
var會遍歷數組array中的每一個索引
awk函數
數值處理:
rand():返回0和1之間一個隨機數
awk 'BEGIN{srand();for(i=1;i<=10;i++)print int(rand()*100)}'
字符串處理:
length([s]):返回指定字符串的長度
sub(s,r[,t]):對t字符串進行搜索s表示的模式匹配的內容,并將第一個匹配的內容替換為r
gsub(s,r[,t]):對t字符串進行搜索s表示的模式匹配的內容,并將所有能匹配的內容替換為r
split(s,array[,r]):以r分隔符切割s,并將切割后的結果保存在array所表示的數組中
自定義函數:
格式:
function name(para1,para2…){
statements
return expression
}
awk中調用shell命令
system命令:
空格是awk中字符串連接符,如果system中需要使用awk中的變量可以使用空格分隔,或者說除了awk的變量外其他一律用""引用起來
awk 'BEGIN{system("hostname")}'
awk 'BEGIN{a="awk";system("echo " a)}'
將awk程序攜程腳本,直接調用或執行
也可以向awk腳本傳遞參數
格式:
awk.awk var=value var2=value2 …inputfile
原創文章,作者:Stupid_L,如若轉載,請注明出處:http://www.www58058.com/48048