AWK高级编程 转载
AWK高級(jí)編程 轉(zhuǎn)載
轉(zhuǎn)載自:http://blog.csdn.net/wzhwho/article/details/5513791
?
1.?程序元素
一個(gè)awk?程序是一對(duì)以模式(pattern)?與大括號(hào)框起來(lái)的操作(action)?組合而成的,或許,還會(huì)加上實(shí)現(xiàn)操作細(xì)節(jié)的函數(shù)(function )?。針對(duì)每個(gè)匹配于輸人數(shù)據(jù)的模式,操作會(huì)被執(zhí)行,且所有模式都會(huì)針對(duì)每條輸人記錄而檢查。模式或操作可省略其中一個(gè)。如果模式省略,則操作將被應(yīng)用到每條輸人記錄;?如果操作省略,則默認(rèn)操作為打印匹配之記錄在標(biāo)準(zhǔn)輸出上。以下是傳統(tǒng)awk?程序的配置:
pattern??{action}?如模式匹配,則執(zhí)行操作
pattern??{action}?如模式匹配,則打印記錄
雖然,模式多半是數(shù)字或字符串表達(dá)式,不過(guò)awk?以保留字BEGIN?與END?提供兩種特殊模式。
與BEGIN 關(guān)聯(lián)的操作只會(huì)執(zhí)行一次,在任何命令行文件或一般命令行賦值被處理之前,但是在任何開(kāi)頭的一V?選項(xiàng)指定已經(jīng)完成之后。
END?操作也是只執(zhí)行一次,用于所有輸入數(shù)據(jù)已被處理完之后。它多半用于產(chǎn)生摘要報(bào)告,或是執(zhí)行清除操作。
BEGIN?與END?模式可以是任意順序,可以存在于awk?程序內(nèi)的任何位置。不過(guò),為了方便,我們通常將BEGIN?模式放在程序的第一個(gè)位置,而將END?模式放在最后。
2.?注釋與空白
awk?里的注釋是從#?開(kāi)始到該行結(jié)束,就像在Shell?里那樣。空行等同于空的注釋。
3.?字符串與字符串表達(dá)式
awk?字符串包含零至多個(gè)字符,且在字符串的長(zhǎng)度上沒(méi)有限制,視可用內(nèi)存而定。
字符串的比較,用的是傳統(tǒng)的關(guān)系運(yùn)算符:==(?相等)?、!=(?不等)?、<(?小于)?、<=(?小于等于)?、>(?大于)?,以及>=(?大于等于》。比較后返回l?為真,0?為假。比較不同長(zhǎng)度的字符串,且其中一個(gè)字符串為另一個(gè)的初始子字符串時(shí),較短的會(huì)定義為小于較長(zhǎng)的那個(gè),因此,“A?”<?“AA?”的值為真。
awk?并無(wú)特殊的字符串接續(xù)運(yùn)算符。也就是說(shuō),兩個(gè)連續(xù)字符串,會(huì)自動(dòng)地連接在一起。以下每一組賦值設(shè)置標(biāo)量變量。為相同的具有四個(gè)字符的字符串:
s =?“ABCD?”
s =?“AB?”“CD?”
s =?“A?”“B?”“CD?”
s =?“A?”“B?”“C?”“D?”
字符串不需要是常數(shù),如果我們繼續(xù)上述的賦值:
t= s s s
則t?的值為“ABCDABCDABCD?“。.
?
將數(shù)字轉(zhuǎn)換為字符串,通過(guò)數(shù)字連接空字符串即可
n =123?,
接著是:
s =?““?n?,把值“123?”賦給s?。
?
awk?功能強(qiáng)大的地方大多來(lái)自于它對(duì)正則表達(dá)式的支持。有兩個(gè)運(yùn)算符:~(?匹配)?與!~(?不匹配)?讓awk?更容易使用正則表達(dá)式:”ABC?”~?”^[A-Z]+$?“,結(jié)果為真。
4.?數(shù)值與數(shù)值表達(dá)式
所有awk?里的數(shù)字,都以雙精確度的浮點(diǎn)值表示。浮點(diǎn)數(shù)可以包含一個(gè)末端以字母e(?或E)?所表示的10?次方指數(shù)以及可選地帶正負(fù)號(hào)的一個(gè)整數(shù)。舉例來(lái)說(shuō):0.03125, 3.125e-2, 3125e-5?與0.003125E1?,同樣都是表示1/32?。因?yàn)閍wk?里所有算術(shù)都是浮點(diǎn)算術(shù)。
awk?并沒(méi)有提供字符串轉(zhuǎn)數(shù)字的函數(shù),不過(guò)awk?的做法很簡(jiǎn)單:只要加個(gè)零到字符串里,例如:s="123"?,接著是n=0+s?,便將數(shù)字123?賦值給n?了。
5. awk?的數(shù)值運(yùn)算符
表9?一:awk?的數(shù)值運(yùn)算符(?優(yōu)先級(jí)由大到小排列)
運(yùn)算符???????????????????說(shuō)明
++ -- 增加與減少( 前置或后置)^ ** 指數(shù)( 右結(jié)合性)! + - 非、一元(unary) 加號(hào)、一元減號(hào)* / % 乘、除、余數(shù)+ - 加、減< <= == != > >= 比較&& 邏輯AND( 簡(jiǎn)寫(xiě))|| 邏輯OR( 簡(jiǎn)寫(xiě))?: 三元條件式= += -= *= /= %= ^= **= 賦值( 右結(jié)合性)?
6.?標(biāo)量變量
保存單一值的變量叫做標(biāo)量變量。
a?wk?的變量名稱必須以ACSII?字母或下劃線開(kāi)始,然后選擇性地接上字母、下劃線及字。因此,變量名稱要匹配正則表達(dá)式[A-Za-z-][A-Za-z_0-9]*?。變量名稱在實(shí)際上并沒(méi)有長(zhǎng)度的限制。awk?的變量名稱是與大小寫(xiě)有關(guān)的:foo, Fo?。與FOO?是完全不同的三個(gè)名稱。一般使用上以及建議用法是:?養(yǎng)成習(xí)慣,將局部變量全設(shè)為小寫(xiě)、全局變量第一個(gè)字母為大寫(xiě),而內(nèi)建變量則全是大寫(xiě)。
?
7.?數(shù)組變量
awk?允許在數(shù)組名稱之后,以方括號(hào)將任意數(shù)字或字符串表達(dá)式?括起來(lái)作為索引。例如:
telephone["Alice"]= “555-0134" telephone["Bob"]= “555-0135" telephone["Carol”]= “555-0136"telephone["Don"]= “555-0141"?
以任意值為索引的數(shù)組,稱之為關(guān)聯(lián)數(shù)組,因?yàn)樗鼈兊拿Q與值是相關(guān)聯(lián)的。重要的是,awk?將其應(yīng)用于數(shù)組中,允許查找( find )?、插入(insert )?以及刪除( remove)?等操作,在一定的時(shí)間內(nèi)完成,與存儲(chǔ)多少項(xiàng)目無(wú)關(guān)。
一個(gè)變量不能同時(shí)用作標(biāo)量變量和數(shù)組變量。當(dāng)你應(yīng)用delet?。語(yǔ)句刪除數(shù)組的元素
(element]?的時(shí)候,不會(huì)刪除它的名稱。因此。像這樣的代碼:
x[1]=3
delete x
x=789
會(huì)引發(fā)awk?發(fā)出提示,告訴你不可以給數(shù)組名稱賦值.
8.?命令行參數(shù)
awk?通過(guò)內(nèi)建變量ARGC(?參數(shù)計(jì)數(shù))?與ARGV(?參數(shù)向量,或參數(shù)值)?,讓命令行參數(shù)
可用。下面簡(jiǎn)短的程序說(shuō)明其用法;
[root@local~]#cat showargs.awkBEGIN{print ”ARGC= ”,ARGCfor (k=0;k<ARGC; k++)print "ARGV[”k”]=[”ARGV[k] “ }?
再來(lái)看看將它用在一般awk?命令行上,會(huì)產(chǎn)生什么樣的結(jié)果:
[root@local~]# awk -v One=1 -v Two=2 -f showargs.awk Three=3 file1 Four=4 filet2 file3ARGC=6ARGV[0]=[awk]ARGV[1]=[Three=3]ARGV[2]=[file1]ARGV[3]=[Four=4]ARGV[4]=[file2]ARGV[5]=[file3]?
9.?環(huán)境變量
awk?提供訪問(wèn)內(nèi)建數(shù)組ENV?工RON?中所有的環(huán)境變量:
[root@local~]#awk 'BEGIN {print ENVIRON["HOME"];print ENVIRON["USER]} ‘/home/Joneshones?
通常你應(yīng)將ENVIRON?看成是一個(gè)只讀數(shù)組。
10.?模式
模式由字符串與?/?或數(shù)值表達(dá)式構(gòu)建而成。常用的模式如下:
NF==0????選定空記錄
NF>3?????選定擁有三個(gè)字段以上的記錄
NR<5????選定第?1?到第?4?條記錄
(FNR==3)&&(FILENAME~/[.] [ch]$/)?來(lái)源于?C?源文件中選定記錄?3
$1~/Jones/???選定字段?1?里有?.?”?jones?“的記錄
/[Xx][Mm][Ll]/?選定含有‘?'XML'?。的記錄,并忽略大小寫(xiě)差異
$0~/[Xx][Mm][Ll]/?同上
11.?操作
以最簡(jiǎn)單的形式來(lái)說(shuō),純print?意指在標(biāo)準(zhǔn)輸出上,打印當(dāng)前的輸入記錄($0)?,接著是輸出記錄分隔字符)ORS?的值,默認(rèn)為單一換行字符。因此,下面這些程序所做的全是相同的操作:
1????模式為真,默認(rèn)操作為打印
NR>0 {print}?有記錄時(shí)打印(?恒為真)
1????{print}??模式為真。則打印,這是默認(rèn)值
{print}??無(wú)模式則視為真,明確的打印,這是默認(rèn)值
{print $0}??相同,但打印明確的值
下面的例子已經(jīng)是完整的awk?程序。在每一個(gè)中,我們都只顯示前三個(gè)輸入字段,并通過(guò)省略選定模式,選定所有的記錄。awk?程序語(yǔ)句以分號(hào)分隔,而且我們會(huì)使用些略微不同的操作代碼,以修改輸出字段分隔字符:
[root@local~]#echo ‘one two three four'| awk ‘{print $1,$2,$3}’ one two three[root@local~]#echo ‘one two three four'| awk ‘{OFS=”…”;print $1,$2,$3}’ one…two…three[root@local~]#echo ‘one two three four'| awk ‘{OFS=”/n”;print $1,$2,$3}’ onetwothree?
?
改變輸出字段分隔字符而沒(méi)有指定任何字段,不會(huì)改變$0:
[root@local~]#echo ‘one two three four'| awk ‘{OFS=”/n”;print $0}’ one two three four?
不過(guò),如果我們更改輸出字段分隔字符,并指定至少一個(gè)字段(?即使我們未變更其值)?,
強(qiáng)制以新的字段分隔字符重新組合記錄,則結(jié)果為:
[root@local~]#echo ‘one two three four'| awk ‘{OFS=”/n”;$1=$1;print $0}’ onetwothreefour?
?
12.?在awk?中的單行程序
1.UNIX?單詞計(jì)數(shù)程序wc;
[root@local~]#awk ‘{C+=length($0)+1;w+=NF} END {print NR, W, C}’?
?
2.?撇開(kāi)NUL?字符問(wèn)題,awk?其實(shí)可以輕松取代cat?,下面這兩個(gè)例子會(huì)產(chǎn)生相同輸出:
[root@local~]# cat*.xml[root@local~]# awk 1*.xml?
?
3.?要將原始數(shù)據(jù)值及它們的對(duì)數(shù)打印為單欄的數(shù)據(jù)文件,可使用:
[root@local~]# awk ‘{print $1, log($1)}’file(s)?
?
4.?在以空白分隔字段的表格中,報(bào)告第n?欄的和:
[root@local~]# awk -v COLUMN=n ‘{sum+=$COLUMN} END {print sum} ’file (s)?
?
5.?微調(diào)上述報(bào)告,產(chǎn)生字段n?的平均值:
[root@local~]# awk -v COLUMN=n ‘{sum+=$COLUMN} END {print sum/NR } ’file (s)?
6.?針對(duì)花費(fèi)文件(?其記錄包含描述與金額于最后一個(gè)字段)?,打印花費(fèi)總數(shù)。可使用內(nèi)建變量NF?計(jì)算總值:
[root@local~]# awk’{sum+=$NF; print $0, sum}’files)?
?
7.?這里是三種查找文件內(nèi)文本的方式:
[root@local~]#egrep ‘pattern|pattern’ file (s)[root@local~]#awk ‘/pattern|pattern/’file (s)[root@local~]#awk ‘/pattern}pattern/ {print FILENAME ”: ”FNR ”: ”$0} ’file(s)?
?
8.?如果你要限制僅查找100?一150?行,可以通過(guò)兩個(gè)工具程序,再搭配管道,不過(guò)這么做會(huì)漏掉位置信息:
[root@local~]#sed -n -e 100,150p -s file(s) | egrep 'pattern'?
使用GNU sed?要搭配-s?選項(xiàng),才能為每個(gè)文件重新開(kāi)始行編號(hào)。另外,你也可以通過(guò)awk?,使用比較花哨的模式來(lái)做:
[root@local~]#awk ‘(100<=FNR) && (FNR <= 150) && /pattern// {print FILENAME ”:” FNR ”:”$0}’file(s)?
9.?要在一個(gè)四欄表格里,調(diào)換第二與第三欄,假設(shè)它們是以制表字符分隔,那么可以
使用下面三種方式的其中一種:
[root@local~]#awk -F'/t’-v OFS='/t’{print $1, $3, $2, $4}’old > new[root@local~]#awk ‘BEGIN{FS=OFS="/t"}{print $1, $3 ,$2 ,$4} ’old>new[root@local~]#awk –F ‘/t’{print $1"/t" $3"/t" $2"/t" $4}’old>new?
?
10.?要將各欄分隔字符由制表字符(?在此以·顯示)?轉(zhuǎn)換成&?,可在以下兩種方式擇一:
[root@local~]#sed -e 's/ ·/&/g' file(s)[root@local~]#awk ‘{BEGIN{FS="/t";OFS= “& ”}{$1=$1; print} ’file(s)?
?
11.?下面這兩個(gè)管道,都為刪除已排序流里的重復(fù)行
[root@local~]#sort file(s)|uniq[root@local~]# sort file(s)|awk ‘Last!=$0 { print }{Last=$0}’?
?
12.?將回車(chē)字符/?換行字符的行終結(jié),一致轉(zhuǎn)換為以換行字符作為行終結(jié),可在下列方
式中選擇一種:
[root@local~]#sed –e ‘s//r$//’ file(s) [root@local~]#sed –e ‘s/^M$//’ file(s) [root@local~]# mawk ‘BEGIN {RS=“/r/n"} {print}’file(s)?
?
13.?要將單空格的文本行,轉(zhuǎn)換為雙空格的行,可在下列方式選擇一種
[root@local~]#sed –e ‘/s/$//n/ ’file(s) [root@local~]#awk ‘BEGTN{ ORS = "/n/n"){print}’file(s)[root@local~]#awk ‘BEGIN{ ORS="/n/n" }1 ’ file(s)[root@local~]#awk {print $0 “/n”} ’ file(s)[root@local~]#awk ‘{print;print ” ”} ’ file(s)?
13.?語(yǔ)句
13.1.?條件語(yǔ)句
if(expressionl)stateme 刀t1else if(expression2)statement2else if(expression3)statement3else if(expressionk)statementkelsestatementk+l?
13.2.?重復(fù)執(zhí)行
awk?提供了?4?種重復(fù)執(zhí)行語(yǔ)句?(?循環(huán)?):
1.?循環(huán)在起始處使用結(jié)束測(cè)試?:
while(expression)
statement
2.?循環(huán)在結(jié)尾處使用結(jié)束測(cè)試?:
do
????????statement
while (expression)
3.?循環(huán)執(zhí)行可計(jì)數(shù)的次數(shù)?:
for(expr1;expr2; expr3)
statement
4.?循環(huán)處理關(guān)聯(lián)數(shù)組里的元素?:
for(key in array)
statement
例如:
for?(name in telephone)
print name“/t" telephone[name]
?
13.3?數(shù)組成員測(cè)試
成員測(cè)試key in array?是一個(gè)表達(dá)式:?如果key?為array?的一個(gè)索引元素,則計(jì)算為1(?真)?。如果key?不是array的一個(gè)索引元素,則!(key in array)?為1?。
對(duì)于具有多下標(biāo)(subscript)?的數(shù)組,在測(cè)試時(shí),請(qǐng)使用圓括號(hào),并以逗點(diǎn)分隔下標(biāo)列表:(i?,j?,…,n)in array
成員測(cè)試不可能建立數(shù)組元素,然而引用元素時(shí),如果元素不存在,便會(huì)建立它。因此你應(yīng)該這么寫(xiě):
if("Sally" in telephone)
print "Sally is in the directory"
而非:
if (telephone["Sally"]!=?””)
????print "Sally is in the directory"
因?yàn)榈诙N形式會(huì)在她(Sally)?不存在時(shí),將其加入到目錄里,并擁有一個(gè)空電話號(hào)碼。
重點(diǎn)是:?你必須能夠區(qū)分尋找索引(index)?與尋找特定值(value)?的差異。索引成員測(cè)試需要固定的時(shí)間,而值的查找時(shí)間是與數(shù)組里元素的個(gè)數(shù)成正比,這點(diǎn)我們?cè)谙惹耙淹ㄟ^(guò)break?語(yǔ)句內(nèi)的for?循環(huán)解釋過(guò)了。如果你需要時(shí)常用到這兩種運(yùn)算,那么構(gòu)建反索引數(shù)組會(huì)比較實(shí)用:
for (name in telephone)
name_by_telephone[telephone[name]]=name
接下來(lái),你就可以使用name_by_telephone ["555-0136"]?在一定時(shí)間內(nèi)找到”Carol"?。當(dāng)然,這里假定所有的值是唯一的:?如果這兩人共享同一個(gè)電話,則name_by_telephone?數(shù)組只會(huì)記錄最后一個(gè)名稱。只要稍做修改就能解決這個(gè)問(wèn)題:
for (name in telephone){if (telephone[name] in name_by_telephone)name_by_telephone[telephone[name]]=/name_by_telephone [telephone[name]) “/t”namee1sename_by_telephone[telephone[name]]=name?
現(xiàn)在,name_by_telephone?即包含了以制表字符分隔的具有相同電話號(hào)碼的人名列表。
14.?用戶控制輸入
awk?也可以通過(guò)的getline?語(yǔ)句做這件事。getline?會(huì)返回一個(gè)值,當(dāng)輸入被成功讀取時(shí),它的返回值為++I?,而返回值為0?時(shí),則表示在文件結(jié)尾,而-1?則表示錯(cuò)誤。它的用法很多,見(jiàn)表。
語(yǔ)法 說(shuō)明getline 從當(dāng)前輸入文件中,讀取下一條記錄,存入$0 ,并更新NF, NR 與FNRgetline var 從當(dāng)前輸入文件中,讀取下一條記錄,存入var ,并更新NR 與FNRgetline<file 從file 文件中,讀取下一條記錄,存入$0 ,并更新NF, NR 與FNRgetline var<file 從file 文件中,讀取下一條記錄,存入var ,并更新NF, NR 與FNRcmd|getline 從外部命令cmd 讀取下一條記錄,存入$0 ,并更新NFcmd|getline var 從外部命令cmd 讀取下一條記錄,存入var?
?
命令管道在awk?里可以發(fā)揮強(qiáng)大的功能。管道可以在字符串中標(biāo)明,也可以包含任意的Shell?命令。這里是與getline?搭配使用,如下:
"date" I getline nowclose("date")print "The current time is".now?
?
接下來(lái)說(shuō)明的是:?如何在循環(huán)里使用命令管道:
command="head -n 15 /etc/hosts"while((command I getline s)>0)print sclose(command)?
15.?執(zhí)行外部程序
這里是解決電話名錄排序問(wèn)題較短的程序方案,使用臨時(shí)性文件與systemty?,而非awk?管道:
tmpfile= “/tmp/telephone.tmp^for (name in telephone>print name "/t" telephone[name]>tmpfileclose(tmpfilejsystem("sort < tmpfile “)?
臨時(shí)性文件必須在調(diào)用system()?之前關(guān)閉,以確保任何緩沖區(qū)輸出都正確地記錄在文件內(nèi)。
對(duì)于被system()?執(zhí)行的命令并不需要調(diào)用close()?,因?yàn)閏lose()?僅針對(duì)以I/O?重定向運(yùn)算符所打開(kāi)的文件或管道,還有g(shù)etline, print?或printf?。
傳遞給system[f?的命令可包含數(shù)行
system("cat <<EOFILE/nuno/ndos/ntres/nEOFILE"
它產(chǎn)生的輸出和從嵌入文件復(fù)制到標(biāo)準(zhǔn)輸出一樣
Un0
das
tres
?
16.?用戶自定義函數(shù)
函數(shù)定義如下:
function name(argl, }rg2,?…,argn
{
statements
}
指定的參數(shù)在函數(shù)體中用來(lái)當(dāng)作局部變量,它們會(huì)隱藏任何相同名稱的全局性變量。函數(shù)也可用于程序它處,調(diào)用的形式為:
name(exprl, expr2,?…,expn)??忽略任何的返回值
result=name(exprl, expr2,?…,exprn)?將返回值存儲(chǔ)到result?中
?
在每個(gè)調(diào)用點(diǎn)上的表達(dá)式,都提供初始值給函數(shù)參數(shù)型變量。以圓括號(hào)框起來(lái)的參數(shù),必須緊接于函數(shù)名稱之后,中間沒(méi)有任何空白。
對(duì)標(biāo)量參數(shù)所做的變動(dòng),調(diào)用者無(wú)從得知,不過(guò)對(duì)數(shù)組的變動(dòng)就可看見(jiàn)了。換句話說(shuō),標(biāo)量為傳值(by vaule ),而數(shù)組則為傳引用(by reference):?這對(duì)C?語(yǔ)言也是這樣。
函數(shù)體里的return expression?語(yǔ)句會(huì)終止主體的執(zhí)行,并將expression?的值與控制權(quán)傳給調(diào)用點(diǎn)。如果expression?省略,則返回值由實(shí)現(xiàn)期定義。我們測(cè)試過(guò)的所有系統(tǒng),返回的不是數(shù)字零就是空字符串。
?
17.?字符串函數(shù)
17.1.?子字符串提取
提取子字符串的函數(shù):substr(string, start, 1en)?,會(huì)返回一份由string?的start?字符開(kāi)始,共len?個(gè)字符長(zhǎng)度的子字符串副本。字符的位置,從1?開(kāi)始編號(hào):substr("abcde", 2, 3)?將返回。bcd"?。?len?參數(shù)可省略,省略時(shí),則默認(rèn)為length(string)-start+1?,選出字符串的剩余部分。
17.2.?字符串大小寫(xiě)轉(zhuǎn)換
tolower(string)?會(huì)返回將所有字母改為同義的小寫(xiě)的string?副本,而toupper(string)?則返回被改為大寫(xiě)字母的string?副本。所以tolower("aBcDeF123")?返回”abcdef123",toupper("aBcDeF123")?返回"ABCDEF123"?。
17.3.?字符串大小寫(xiě)轉(zhuǎn)換
index(string,??find)?查找string?里是否有字符串find?,然后返回string?里find?字符串的起始位置,如果在string?里找不到find?,則返回0?。例如index("abcdef","de")?會(huì)返回4?。
17.4.?字符串匹配
match?(string, regexp)?將string?與正則表達(dá)式regexp?匹配,如果匹配,則返回
匹配string?的索引,不匹配,則返回0?。這種方式提供了比表達(dá)式(string~regexp)?還多的信息,后者只能得到計(jì)算值1?或0?。另外match ( )?也具有一個(gè)有用的副作用:?它會(huì)將全局變量RSTART?設(shè)為在string?中要開(kāi)始匹配的索引值,而將RLENGTH?設(shè)為要匹配的長(zhǎng)度。而匹配子字符串則以substr(string, RSTART, RLENGTH)?表示。
17.5.?字符串替換
awk?在字符串替換功能上,提供兩個(gè)函數(shù):sub(regexp, replacement, target)?與gsub(regexp, replacement, target), sub()?將target?與正則表達(dá)式regexp?進(jìn)行匹配,將最左邊最長(zhǎng)的匹配部分替換為字符串replacement。gsub()?的運(yùn)行則有點(diǎn)類似,不過(guò)它會(huì)替換所有匹配的字符串(?前置g?表示global?全局之意)?。
17.6.?字符串替換
awk?針對(duì)當(dāng)前輸人記錄$0?自動(dòng)提供了方便的分割為字1,??$},?…、$NF?,也可以函數(shù)來(lái)做:split(string, array, regexp)?將string?切割為片段,并存儲(chǔ)到array?里的連續(xù)元素。在數(shù)組里,片段放置在匹配正則表達(dá)式regexp?的子字符串之間。如果regexp?省略,則使用內(nèi)建字段分隔字符FS?的當(dāng)前默認(rèn)值。函數(shù)會(huì)返回array?里的元素?cái)?shù)量。
17.7.?字符串重建
join()?可確保參數(shù)數(shù)組不會(huì)被引用到,除非索引是在范圍之內(nèi)。否則,一個(gè)具有數(shù)組長(zhǎng)度為0?的調(diào)用可能會(huì)建立arrayfl3?,而修改了調(diào)用者的數(shù)組。插人的字段分隔字符為普通字符串,而非正則表達(dá)式,所以針對(duì)傳遞給split()?的一般正則表達(dá)式,join()?不會(huì)重建精確的原始字符串。
17.8.?字符串格式化
最后一個(gè)與字符串相關(guān)的函數(shù)是在用戶控制下格式化數(shù)字與字符串:sprintf (format,expression1, expression2,…)?,它會(huì)返回已格式化的字符串作為其函數(shù)值。printf()?的運(yùn)行方式也是這樣,只不過(guò)它會(huì)在標(biāo)準(zhǔn)輸出或重定向的文件上顯示格式化后的字符串,而不是返回其函數(shù)值。較新的程序語(yǔ)言以更強(qiáng)大的格式化函數(shù)來(lái)取代格式控制字符串,但相對(duì)而言讓代碼變得很冗長(zhǎng)。按照傳統(tǒng)的文本處理應(yīng)用來(lái)說(shuō),sprintf?與printf
18.?數(shù)值函數(shù)
函數(shù)???????????說(shuō)明
atan2(y, x)???y?返回y/x?的反正切,值介于-pai?與+pai?之間。
cos(x)????????返回x?的余弦值(?以弧度(radians)?計(jì)算)?,該值介于-1?與+1?之間
exp(x)????????返回x?的指數(shù),ex,
int(x)????????返回x?的整數(shù)部分,截去前置的0
log(x)????????返回x?的自然對(duì)數(shù)。
rand()????????返回平均分布的虛擬隨機(jī)r,O<=r<l
sin(x)????????返回x?的正弦值(?以弧度(radians]?計(jì)算)?,該值介于-1?與+1?之間
sqrt(x)???????返回x?的平方
srand(x)??????設(shè)置虛擬隨機(jī)產(chǎn)生器的種子為x?,并返回正確的種子。如果省略x?,則使用當(dāng)前時(shí)間(?以秒計(jì))?。如果。rand ( )?未被調(diào)用,則awk?在每次執(zhí)行時(shí)會(huì)從相同的默認(rèn)種子開(kāi)始;mawk?則不會(huì)。
?
系統(tǒng)巡檢腳本 [復(fù)制鏈接]
--http://www.apelearn.com/bbs/thread-651-1-1.html
要求如下:
請(qǐng)使用vmstat采集間隔1秒連續(xù)60秒得數(shù)據(jù),匯總各項(xiàng)數(shù)據(jù)的平均值,一并形成一個(gè)報(bào)告。
vmstat 1 60
#! /bin/bash## for vmstat 1 60 and get the average number. ## Writern by Aming.comm="/usr/bin/vmstat" f1="/tmp/1.txt" f2="/tmp/2.txt" f3="/tmp/3.txt"$comm 1 60 >$f1 tail -n 60 $f1 >$f2 n=`awk '{print NF}' $f2 |head -n1` echo "">$f3 for i in `seq 1 $n`; do awk 'BEGIN {a=0}; {a=a+$"'$i'"};END{print a/NR}' $f2 >> $f3 donecat $f1 echo "the average number is:" echo "-----------------------------------------------------------------------------------" cat $f3|xargs?
?
?
刪除文件的某一列,不打印文件的某一列
刪除文件的某一行,不打印文件的某一行
比如刪除第二列
賦值:'{$2="" ;print $0}'
awk -F ',' '{$2="" ;print $0}' 1.txt >2.txt?
比如刪除第二行
awk '{print $$2}' 1.txt 2 k 5 dfeii l 11 l?
要打印一定要加BEGIN
[root@steven tmp]# awk '{print " '\'' "}'
^C
[root@steven tmp]# awk 'BEGIN{print " '\'' "}'
?'
計(jì)算之后再輸出 老男孩 sersync實(shí)戰(zhàn)
echo -en "$(date +%H%M)\t" >>/tmp/tmp1.log? &&tree |wc -l >>/tmp/tmp1.log
echo -en "$(date +%H%M)\t" >>/tmp/tmp2.log? &&tree |wc -l >>/tmp/tmp2.log
paste tmp1.log? tmp2.log >total.txt
awk '{if($1==$3) print $1" "$2" "$4" "(($2-$4));}' total.txt
?cat total.txt
1134?? ?349?? ?1134?? ?350
1134?? ?350?? ?1134?? ?45
1134?? ?350?? ?1134?? ?45
1134?? ?350?? ?1134?? ?45
awk '{if($1==$3) print $1" "$2" "$4" "(($2-$4));}' total.txt
1134 349 350 -1
1134 350 45 305
1134 350 45 305
1134 350 45 305
?
?
f
?
轉(zhuǎn)載于:https://www.cnblogs.com/MYSQLZOUQI/p/5199750.html
總結(jié)
以上是生活随笔為你收集整理的AWK高级编程 转载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Subsets
- 下一篇: 手机支付:电信运营商会被边缘化吗?!