1、介紹
? ? ? ? awk是一種編程語(yǔ)言惧磺,用于在linux/unix下對(duì)文本和數(shù)據(jù)進(jìn)行處理颖对。數(shù)據(jù)可以來自標(biāo)準(zhǔn)輸入(stdin)、一個(gè)或多個(gè)文件磨隘,或其它命令的輸出缤底。它支持用戶自定義函數(shù)和動(dòng)態(tài)正則表達(dá)式等先進(jìn)功能,是linux/unix下的一個(gè)強(qiáng)大編程工具番捂。它在命令行中使用个唧,但更多是作為腳本來使用。awk有很多內(nèi)建的功能设预,比如數(shù)組徙歼、函數(shù)等,這是它和C語(yǔ)言的相同之處鳖枕,靈活性是awk最大的優(yōu)勢(shì)
2魄梯、語(yǔ)法
awk [options] 'script' var=value?file(s)
awk [options] -f scriptfile var=value file(s)
-F?fs ??fs指定輸入分隔符,fs可以是字符串或正則表達(dá)式宾符,如-F:
-v?var=value ??賦值一個(gè)用戶定義變量酿秸,將外部變量傳遞給awk
-f?scripfile ?從腳本文件中讀取awk命令
-m[fr]?val ??對(duì)val值設(shè)置內(nèi)在限制,-mf選項(xiàng)限制分配給val的最大塊數(shù)目魏烫;-mr選項(xiàng)限制記錄的最大數(shù)目
2辣苏、awk工作原理
awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
第一步:執(zhí)行BEGIN{ commands }語(yǔ)句塊中的語(yǔ)句;
第二步:從文件或標(biāo)準(zhǔn)輸入(stdin)讀取一行哄褒,然后執(zhí)行pattern{ commands }語(yǔ)句塊稀蟋,它逐行掃描文件,從第一行到最后一行重復(fù)這個(gè)過程读处,直到文件全部被讀取完畢糊治。
第三步:當(dāng)讀至輸入流末尾時(shí),執(zhí)行END{ commands }語(yǔ)句塊罚舱。
3井辜、使用
echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }'
v1=v2=v3
cat a.js
1
2
3
awk 'BEGIN{print "start"} {a+=$1} END{print a}' b.js
start
6
4、內(nèi)置變量
說明:[A][N][P][G]表示第一個(gè)支持變量的工具管闷,[A]=awk粥脚、[N]=nawk、[P]=POSIXawk包个、[G]=gawk
$n 當(dāng)前記錄的第n個(gè)字段刷允,比如n為1表示第一個(gè)字段冤留,n為2表示第二個(gè)字段。
$0 這個(gè)變量包含執(zhí)行過程中當(dāng)前行的文本內(nèi)容树灶。
[N] ARGC 命令行參數(shù)的數(shù)目纤怒。
[G] ARGIND 命令行中當(dāng)前文件的位置(從0開始算)。
[N] ARGV 包含命令行參數(shù)的數(shù)組天通。
[G] CONVFMT 數(shù)字轉(zhuǎn)換格式(默認(rèn)值為%.6g)泊窘。
[P] ENVIRON 環(huán)境變量關(guān)聯(lián)數(shù)組。
[N] ERRNO 最后一個(gè)系統(tǒng)錯(cuò)誤的描述像寒。
[G] FIELDWIDTHS 字段寬度列表(用空格鍵分隔)烘豹。
[A] FILENAME 當(dāng)前輸入文件的名。
[P] FNR 同NR诺祸,但相對(duì)于當(dāng)前文件携悯。
[A] FS 字段分隔符(默認(rèn)是任何空格)。
[G] IGNORECASE 如果為真筷笨,則進(jìn)行忽略大小寫的匹配憔鬼。
[A] NF 表示字段數(shù),在執(zhí)行過程中對(duì)應(yīng)于當(dāng)前的字段數(shù)胃夏。
[A] NR 表示記錄數(shù)逊彭,在執(zhí)行過程中對(duì)應(yīng)于當(dāng)前的行號(hào)。
[A] OFMT 數(shù)字的輸出格式(默認(rèn)值是%.6g)构订。
[A] OFS 輸出字段分隔符(默認(rèn)值是一個(gè)空格)。
[A] ORS 輸出記錄分隔符(默認(rèn)值是一個(gè)換行符)避矢。
[A] RS 記錄分隔符(默認(rèn)是一個(gè)換行符)悼瘾。
[N] RSTART 由match函數(shù)所匹配的字符串的第一個(gè)位置。
[N] RLENGTH 由match函數(shù)所匹配的字符串的長(zhǎng)度审胸。
[N] SUBSEP 數(shù)組下標(biāo)分隔符(默認(rèn)值是34)亥宿。
1)每行的最后一個(gè)值
echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $NF}'
f3
f5
echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $(NF-1)}'
f2
f4
2)每行的列數(shù)
echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print NF}'
3
3
3)傳遞參數(shù)
VAR=10000
echo | awk -v VARIABLE=$VAR '{ print VARIABLE }'
5、運(yùn)算和判斷
awk 'BEGIN{a="b";print a++,++a;}'
0 2
awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}'
1
注意:所有用作算術(shù)運(yùn)算符進(jìn)行操作砂沛,操作數(shù)自動(dòng)轉(zhuǎn)為數(shù)值烫扼,所有非數(shù)值都變?yōu)?
awk 'BEGIN{
????test=100;
????if(test>90){
????????print "very good";
????} else if(test>60){
????????print "good";
????} else{
????????print "no pass";
????}
}'
very good
awk 'BEGIN{
for(k in ENVIRON){
print k"="ENVIRON[k];
}
}'
TERM=linuxG_BROKEN_FILENAMES=1SHLVL=1
pwd=/root/text...
logname=root
HOME=/root
SSH_CLIENT=192.168.1.21 53087 22
6、高級(jí)輸入
cat a.js
a
b
c
d
e
awk 'NR%2==1{next}{print NR,$0;}' a.js
2 b
4 d
cat a.js:
web01[192.168.2.100]
httpd ok
tomcat ok
sendmail ok
web02[192.168.2.101]
httpd ok
postfix ok
web03[192.168.2.102]
mysqld ok
httpd ok
awk '/^web/{T=$0;next;}{print T":\t"$0;}' a.js
web01[192.168.2.100]: httpd okweb01[192.168.2.100]: tomcat okweb01[192.168.2.100]: sendmail okweb02[192.168.2.101]: httpd okweb02[192.168.2.101]: postfix okweb03[192.168.2.102]: mysqld okweb03[192.168.2.102]: httpd ok
執(zhí)行shell的date命令碍庵,并通過管道輸出給getline映企,然后getline從管道中讀取并將輸入賦值給out,split函數(shù)把變量out轉(zhuǎn)化成數(shù)組mon静浴,然后打印數(shù)組mon的第二個(gè)元素
awk 'BEGIN{ "date" | getline out; split(out,mon); print mon[1] }' test
2018年
awk 'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}'
2 is
3 a
4 test
1 it
awk 'BEGIN{OFMT="%.3f";fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,fi;}'0.841 22026.466 2.303 3