1.awk?
????awk是一個(gè)強(qiáng)大的文本分析工具,它可以通過(guò)分析文本來(lái)生成一個(gè)數(shù)據(jù)報(bào)告。它的原理就是讀取每行的輸入傲武,然后按照分隔符切分(默認(rèn)是空格),再進(jìn)行定制計(jì)算城榛。 ? ?
awk?'{print?$1}'?/etc/passwd???#打印出passwd文件的所有行的第一列
這是awk的基礎(chǔ)語(yǔ)法揪利,在awk中$n代表列數(shù),即$1--第一列狠持,$2---第二列....,但是$0代表整行
????接下來(lái)我們按照指定的分隔符打印數(shù)據(jù):
awk?-F?':'?'{print?$1}'?/etc/passwd??#將每行按照冒號(hào)分隔疟位,打印第一列
現(xiàn)在我們來(lái)用另外一種awk的寫法打印上圖的輸出
cat?/etc/passwd?|?awk?-F?':'?'{print?$1}'
awk有一些必須掌握的參數(shù):
[plain]?view plain?copy
ARGC?????命令行參數(shù)個(gè)數(shù)??
ARGV?????命令行參數(shù)排列??
FILENAME?AWK瀏覽文件的文件名??
FNR??????瀏覽文件的記錄數(shù)??
FS???????設(shè)置輸入域分隔符,跟-F一樣??
NF???????域的索引工坊,即列號(hào)??
NR???????awk讀取的當(dāng)前行號(hào)??
OFS??????輸出域分隔符??
ORS??????輸出記錄分隔符??
RS???????控制記錄分隔符??
現(xiàn)在我們來(lái)打印第一列献汗,當(dāng)前行號(hào),列號(hào)的值
cat?/etc/passwd?|?awk?'{print?"cols:",$1,"?rowNumber:",NR,"?colNumber:",NF}'
awk的語(yǔ)法結(jié)構(gòu)為 awk 'BEGIN{statements} ?{statements} ?END{statements}' ?其中在BEGIN中的語(yǔ)句是初始化一些變量或者打印一些初始數(shù)據(jù)的地方王污,在中間的{}中是進(jìn)行一些邏輯運(yùn)算的地方罢吃,在END{}中的語(yǔ)句是在計(jì)算完成輸出之后需要追加的一些輸出
cat?/etc/passwd?|?awk?'BEGIN{count=0}?{count=count+1;print?"count=",count}?END{print?"END",NR}'
????再來(lái)看看awk的for和while操作:
ls?-l?|?awk?'BEGIN?{print?user,time,row}?{for(i?=0;?i<?FNR;i++)?{print?$3,$7,NR}}'??#按照總行數(shù)循環(huán)打印出第三列和第七列,還有行數(shù)
ls?-l?|?awk?'BEGIN{print?"begin?"}?{print?$0;count=0;while?(count?<?2)?{print?$9;count=count+1;}?print?"count=",count}'
????運(yùn)用awk計(jì)算當(dāng)前文件夾下文件的總大小
ls?-l?|?awk?'BEGIN{count=0}?{count?=?count?+?$5;}?END{print?"total=",count}'