AWK增强的文本处理shell特征--AWK完全手册
AWK這是一個很好的文字處理工具。
它不僅 Linux 中也是不論什么環境中現有的功能最強大的數據處理引擎之中的一個。
本文主要摘錄池中龍寫的Unixawk使用手冊(第二版),對當中內容略微修改。感謝作者的分享。
目 錄 1
0作者的話 2
1awk的調用方式 3
2awk的語法 4
3awk的記錄、字段與內置變量 5
4awk的內置函數 5
5在命令行使用awk 6
6awk的變量 7
7運算與推斷 7
8awk的流程控制 8
8.1BEGIN和END: 8
8.2流程控制語句 9
8.2.1if...else語句: 9
8.2.2while語句 9
8.2.3do-while語句 10
8.2.4for語句 10
9awk中的自己定義函數 10
10awk高級輸入輸出 12
10.1讀取下一條記錄: 12
10.2簡單地讀取一條記錄 12
10.3關閉文件: 13
10.4輸出到一個文件: 13
10.5輸出到一個命令 13
10awk與shellscript混合編程 14
10.1awk讀取Shellscript程序變量 14
10.2將shell命令的運行結果送給awk處理 14
10.3shell script程序讀awk的運行結果 15
10.4在awk中運行shell命令行----嵌入函數system() 15
附錄 16
附1awk的常規表達式元字符 16
附2awk算術運算符 16
附3awk同意的測試 17
附4awk的操作符(按優先級升序排列) 17
附5awk內置變量(提前定義變量) 18
附6awk的內置函數 18
參考資料 19
0作者的話
《UNIXAWK使用手冊》是我幾個月前的作品了,回過頭來看,這篇文章實在是非常粗燥,因當時我寫作并上傳這個作品時實在是太忙了,沒有對文章的質量進行非常好的檢查,心里老認為有愧于網友的厚愛。于是趁閑趕忙重寫一遍,盡管不一定會有非常大的改觀,但質量是肯定要好一點的。唯如此。我的良心上才好受一點。呶,以下就是我的改動稿,各位老友請與第一版相比一下。看是否有所進步。
這次改寫仍然保留了原有的風格:正文由淺入深,文后附上了大量的相關資料,這樣做的原因是為了滿足各種用戶的需求。這在第一版中已經說過了。
這次基本的改變是在內容上,添加了非常多新內容。并添加了演示樣例。以幫助讀者理解當中的內容,附錄也補充了很多新的資料。當然讀者要真正地掌握awk,只讀了本文是不夠的。還必須有上機實習這一步。值得提醒大家的是,awk有非常多版本號。并且各個版本號之間存在著一些區別。因此,在使用awk曾經最好參考一下你使用的系統的聯機幫助。
什么是awk?
你可能對UNIX比較熟悉,但你可能對awk非常陌生。這一點也不奇怪,的確,與其優秀的功能相比,awk還遠沒達到它應有的知名度。awk是什么?與其他大多數UNIX命令不同的是,從名字上看。我們不可能知道awk的功能:它既不是具有獨立意義的英文單詞。也不是幾個相關單詞的縮寫。其實,awk是三個人名的縮寫。他們是:Aho、(Peter)Weinberg和(Brain)Kernighan。正是這三個人創造了awk---一個優秀的樣式掃描與處理工具。
AWK的功能是什么?與sed和grep非常相似,awk是一種樣式掃描與處理工具。但其功能卻大大強于sed和grep。awk提供了極其強大的功能:它差點兒能夠完畢grep和sed所能完畢的所有工作。同一時候,它還能夠能夠進行樣式裝入、流控制、數學運算符、進程控制語句甚至于內置的變量和函數。它具備了一個完整的語言所應具有的差點兒所有精美特性。
實際上。awk的確擁有自己的語言:awk程序設計語言。awk的三位創建者已將它正式定義為:樣式掃描和處理語言(注:這里的樣式指pattern)。
為什么使用awk?
即使如此。你或許仍然會問,我為什么要使用awk?
使用awk的第一個理由是基于文本的樣式掃描和處理是我們常常做的工作,awk所做的工作有些象數據庫,但與數據庫不同的是。它處理的是文本文件,這些文件沒有專門的存儲格式。普通的人們就能編輯、閱讀、理解和處理它們。
而數據庫文件往往具有特殊的存儲格式。這使得它們必須用數據庫處理程序來處理它們。既然這樣的類似于數據庫的處理工作我們常常會遇到,我們就應當找到處理它們的簡便易行的方法。UNIX有非常多這方面的工具,比如sed、grep、sort以及find等等。awk是當中十分優秀的一種。
使用awk的第二個理由是awk是一個簡單的工具,當然這是相對于其強大的功能來說的。
的確,UNIX有很多優秀的工具,比如UNIX天然的開發工具C語言及其延續C++就非常的優秀。但相對于它們來說。awk完畢相同的功能要方便和簡捷得多。這首先是由于awk提供了適應多種須要的解決方式:從解決簡單問題的awk命令行到復雜而靜止的awk程序設計語言,這樣做的優點是,你能夠不必用復雜的方法去解決本來非常easy的問題。比如,你能夠用一個命令行解決簡單的問題,而C不行,即使一個再簡單的程序,C語言也必須經過編寫、編譯的全過程。其次。awk本身是解釋運行的,這就使得awk程序不必經過編譯的過程,同一時候,這也使得它與shellscript程序能夠非常好的契合。
最后,awk本身較C語言簡單,盡管awk吸收了C語言非常多優秀的成分。熟悉C語言會對學習awk有非常大的幫助。但awk本身不須要會使用C語言——一種功能強大但須要大量時間學習才干掌握其技巧的開發工具。
使用awk的第三個理由是awk是一個easy獲得的工具。與C和C++語言不同,awk僅僅有一個文件(/bin/awk),并且差點兒每一個版本號的UNIX都提供各自版本號的awk,你全然不必費心去想怎樣獲得awk。但C語言卻不是這樣。盡管C語言是UNIX天然的開發工具,但這個開發工具卻是單獨發行的。換言之。你必須為你的UNIX版本號的C語言開發工具單獨付費(當然使用D版者除外),獲得并安裝它,然后你才干夠使用它。
基于以上理由。再加上awk強大的功能,我們有理由說,假設你要處理與文本樣式掃描相關的工作,awk應該是你的第一選擇。在這里有一個可遵循的一般原則:假設你用普通的shell工具或shellscript有困難的話,試試awk,假設awk仍不能解決這個問題。則便用C語言,假設C語言仍然失敗,則移至C++。
1awk的調用方式
前面以前說過。awk提供了適應多種須要的不同解決方式。它們是:
1)awk命令行。
你能夠象使用普通UNIX命令一樣使用awk,在命令行中你也能夠使用awk程序設計語言,盡管awk支持多行的錄入。可是錄入長長的命令行并保證其正確無誤卻是一件令人頭疼的事。因此。這樣的方法一般僅僅用于解決簡單的問題。當然,你也能夠在shellscript程序中引用awk命令行甚至awk程序腳本。
2)使用-f選項調用awk程序。awk同意將一段awk程序寫入一個文本文件。然后在awk命令行中用-f選項調用并運行這段程序。詳細的方法我們將在后面的awk語法中講到。
3)利用命令解釋器調用awk程序。利用UNIX支持的命令解釋器功能。我們能夠將一段awk程序寫入文本文件,然后在它的第一行加上:
#!/bin/awk-f
并賦予這個文本文件以運行的權限。這樣做之后。你就能夠在命令行中用類似于以下這種方式調用并運行這段awk程序了。
$awk腳本文本名待處理文件
2awk的語法
與其他UNIX命令一樣,awk擁有自己的語法:
awk[ -F re] [parameter...] ['prog'] [-f progfile][in_file...]
參數說明:
1)-Fre:同意awk更改其字段分隔符。
2)parameter: 該參數幫助為不同的變量賦值。
3)'prog':awk的程序語句段。這個語句段必須用單引號:'和'括起。以防被shell解釋。
這個程序語句段的標準形式為:
'pattern{action}'
當中pattern參數能夠是egrep正則表達式中的不論什么一個,它能夠使用語法/re/再加上一些樣式匹配技巧構成。與sed類似。你也能夠使用","分開兩樣式以選擇某個范圍。關于匹配的細節。你能夠參考附錄。假設仍不懂的話。找本UNIX書學學grep和sed(本人是在學習sed時掌握匹配技術的)。
action參數總是被大括號包圍,它由一系統awk語句組成,各語句之間用";"分隔。awk解釋它們,并在pattern給定的樣式匹配的記錄上運行其操作。與shell類似,你也能夠使用“#”作為凝視符,它使“#”到行尾的內容成為凝視,在解釋運行時,它們將被忽略。
你能夠省略pattern和action之中的一個。但不能兩者同一時候省略,當省略pattern時沒有樣式匹配,表示對全部行(記錄)均運行操作。省略action時運行缺省的操作——在標準輸出上顯示。
4)-f progfile:同意awk調用并運行progfile指定的程序文件。progfile是一個文本文件,他必須符合awk的語法。
5)in_file:awk的輸入文件。awk同意對多個輸入文件進行處理。值得注意的是awk不改動輸入文件。假設未指定輸入文件。awk將接受標準輸入。并將結果顯示在標準輸出上。awk支持輸入輸出重定向。
3awk的記錄、字段與內置變量
前面說過,awk處理的工作與數據庫的處理方式有同樣之處,其同樣處之中的一個就是awk支持對記錄和字段的處理。當中對字段的處理是grep和sed不能實現的,這也是awk優于二者的原因之中的一個。在awk中,缺省的情況下總是將文本文件里的一行視為一個記錄,而將一行中的某一部分作為記錄中的一個字段。
為了操作這些不同的字段,awk借用shell的方法,用$1,$2,$3...這種方式來順序地表示行(記錄)中的不同字段。
特殊地,awk用$0表示整個行(記錄)。不同的字段之間是用稱作分隔符的字符分隔開的。
系統默認的分隔符是空格。awk同意在命令行中用-Fre的形式來改變這個分隔符。其實,awk用一個內置的變量FS來記憶這個分隔符。
awk中有好幾個這種內置變量。比如,記錄分隔符變量RS、當前工作的記錄數NR等等。本文后面的附表列出了所有的內置變量。這些內置的變量能夠在awk程序中引用或改動,比如,你能夠利用NR變量在模式匹配中指定工作范圍,也能夠通過改動記錄分隔符RS讓一個特殊字符而不是換行符作為記錄的分隔符。
例:顯示文本文件myfile中第七行到第十五行中以字符%分隔的第一字段,第三字段和第七字段:
$awk -F % 'NR==7,NR==15{printf $1 $3 $7}' myfile
4awk的內置函數
awk之所以成為一種優秀的程序設計語言的原因之中的一個是它吸收了某些優秀的程序設計語言(比如C)語言的很多長處。這些長處之中的一個就是內置函數的使用,awk定義并支持了一系列的內置函數。因為這些函數的使用,使得awk提供的功能更為完好和強大,比如,awk使用了一系列的字符串處理內置函數(這些函數看起來與C語言的字符串處理函數相似,其使用方式與C語言中的函數也相差無幾)。正是因為這些內置函數的使用,使awk處理字符串的功能更加強大。本文后面的附錄中列有一般的awk所提供的內置函數,這些內置函數或許與你的awk版本號有些出入,因此。在使用之前,最好參考一下你的系統中的聯機幫助。
作為內置函數的一個樣例,我們將在這里介紹awk的printf函數,這個函數使得awk與c語言的輸出相一致。實際上。awk中有很多引用形式都是從C語言借用過來的。假設你熟悉C語言。你或許會記得當中的printf函數,它提供的強大格式輸出功能以前帶我們很多的方便。
幸運的是,我們在awk中又和它重逢了。awk中printf差點兒與C語言中一模一樣,假設你熟悉C語言的話,你全然能夠照C語言的模式使用awk中的printf。因此在這里。我們僅僅給出一個樣例,假設你不熟悉的話。請隨便找一本C語言的入門書翻翻。
例:顯示文件myfile中的行號和第3字段:
$awk'{printf"%03d%s\n",NR,$1}' myfile
5在命令行使用awk
依照順序,我們應當解說awk程序設計的內容了,但在解說之前,我們將用一些樣例來對前面的知識進行回想,這些樣例都是在命令行中使用的,由此我們能夠知道在命令行中使用awk是多么的方便。這樣做的原因一方面是為以下的內容作鋪墊,還有一方面是介紹一些解決簡單問題的方法。我們全然沒有必要用復雜的方法來解決簡單的問題----既然awk提供了較為簡單的方法的話。
例:顯示文本文件mydoc匹配(含有)字符串"sun"的全部行。
$awk'/sun/{print}' mydoc
因為顯示整個記錄(全行)是awk的缺省動作,因此能夠省略action項。
$awk'/sun/' mydoc
例:以下是一個較為復雜的匹配的演示樣例:
$awk'/[Ss]un/, /[Mm]oon/{print}'myfile
它將顯示第一個匹配Sun或sun的行與第一個匹配Moon或moon的行之間的行(注意:!
。),并顯示到標準輸出上。
例:以下的演示樣例顯示了內置變量和內置函數length()的使用:
$awk'length($0)>80{print NR}' myfile
該命令行將顯示文本myfile中全部超過80個字符的行號。在這里,用$0表示整個記錄(行),同一時候,內置變量NR不使用標志符'$'。
例:作為一個較為實際的樣例。我們如果要對UNIX中的用戶進行安全性檢查。方法是考察/etc下的passwd文件,檢查當中的passwd字段(第二字段)是否為"*",如不為"*"。則表示該用戶沒有設置password,顯示出這些username(第一字段)。我們能夠用例如以下語句實現:
#awk-F: '$2==""{printf("%s no password!\n",$1}'/etc/passwd
在這個演示樣例中。passwd文件的字段分隔符是“:”。因此。必須用-F:來更改默認的字段分隔符。這個演示樣例中也涉及到了內置函數printf的使用。
6awk的變量
如同其他程序設計語言一樣,awk同意在程序語言中設置變量。其實,提供變量的功能是程序設計語言的其本要求。不提供變量的程序設計語言本人還從未見過。
awk提供兩種變量,一種是內置變量。這前面我們已經講過,須要著重指出的是,與后面提到的其他變量不同的是。在awk程序中引用內置變量不須要使用標志符"$"(回顧一下前面講過的NR的使用)。awk提供的還有一種變量是自己定義變量。awk同意用戶在awk程序語句中定義并調用自已的變量。
當然這樣的變量不能與內置變量及其他awk保留字同樣。在awk中引用自己定義變量必須在它前面加上標志符"$"。
與C語言不同的是,awk中不須要對變量進行初始化,awk依據其在awk中第一次出現的形式和上下文確定其詳細的數據類型。當變量類型不確定時。awk默認其為字符串類型。
這里有一個技巧:假設你要讓你的awk程序知道你所使用的變量的明白類型,你應當在在程序中給它賦初值。在后面的實例中。我們將用到這一技巧。
7運算與推斷
作為一種程序設計語言所應具有的特點之中的一個。awk支持多種運算,這些運算與C語言提供的基本同樣:如+、-、*、/、%等等,同一時候。awk也支持C語言中類似++、--、+=、-=、=+、=-之類的功能,這給熟悉C語言的使用者編寫awk程序帶來了極大的方便。作為對運算功能的一種擴展,awk還提供了一系列內置的運算函數(如log、sqr、cos、sin等等)和一些用于對字符串進行操作(運算)的函數(如length、substr等等)。這些函數的引用大大的提高了awk的運算功能。
作為對條件轉移指令的一部分,關系推斷是每種程序設計語言都具備的功能,awk也不例外。awk中同意進行多種測試,如經常使用的==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、>=(小于等于)等等。同一時候,作為樣式匹配,還提供了~(匹配于)和!
~(不匹配于)推斷。
作為對測試的一種擴充,awk也支持用邏輯運算符:!(非)、&&(與)、||(或)和括號()進行多重推斷。這大大增強了awk的功能。本文的附錄中列出了awk所同意的運算、推斷以及操作符的優先級。
8awk的流程控制
流程控制語句是不論什么程序設計語言都不能缺少的部分。不論什么好的語言都有一些運行流程控制的語句。awk提供的完備的流程控制語句類似于C語言。這給我們編程帶來了極大的方便。
8.1BEGIN和END:
在awk中兩個特別的表達式。BEGIN和END,這兩者都可用于pattern中(參考前面的awk語法),提供BEGIN和END的作用是給程序賦予初始狀態和在程序結束之后運行一些掃尾的工作。不論什么在BEGIN之后列出的操作(在{}內)將在awk開始掃描輸入之前運行,而END之后列出的操作將在掃描完所有的輸入之后運行。因此。通常使用BEGIN來顯示變量和預置(初始化)變量。使用END來輸出終于結果。
例:累計銷售文件xs中的銷售金額(如果銷售金額在記錄的第三字段):
$awk
>'BEGIN{ FS=":";print "統計銷售金額";total=0}
>{print$3;total=total+$3;}
>END{printf "銷售金額總計:%.2f",total}'sx
(注:>是shell提供的第二提示符。如要在shell程序awk語句和awk語言中換行,則需在行尾加反斜杠\)
在這里,BEGIN預置了內部變量FS(字段分隔符)和自己定義變量total,同一時候在掃描之前顯示出輸出行頭。而END則在掃描完畢后打印出總合計。
8.2流程控制語句
awk提供了完備的流程控制語句,其使用方法與C語言類似。以下我們一一加以說明:
8.2.1if...else語句:
格式:
if(表達式)
語句1
else
語句2
格式中"語句1"能夠是多個語句,假設你為了方便awk推斷也方便你自已閱讀。你最好將多個語句用{}括起來。
awk分枝結構同意嵌套,其格式為:
if(表達式1)
{if(表達式2)
語句1
else
語句2
}
語句3
else{if(表達式3)
語句4
else
語句5
}
語句6
當然實際操作過程中你可能不會用到如此復雜的分枝結構,這里僅僅是為了給出其樣式罷了。
8.2.2while語句
格式為:
while(表達式)
語句
8.2.3do-while語句
格式為:
do
{
語句
}while(條件推斷語句)
8.2.4for語句
格式為:
for(初始表達式;終止條件;步長表達式)
{語句}
在awk的while、do-while和for語句中同意使用break,continue語句來控制流程走向。也同意使用exit這種語句來退出。break中斷當前正在運行的循環并跳到循環外運行下一條語句。continue從當前位置跳到循環開始處運行。對于exit的運行有兩種情況:當exit語句不在END中時,不論什么操作中的exit命令表現得如同到了文件尾,全部模式或操作運行將停止。END模式中的操作被運行。而出如今END中的exit將導致程序終止。
9awk中的自己定義函數
定義和調用用戶自己的函數是差點兒每一個高級語言都具有的功能,awk也不例外,但原始的awk并不提供函數功能,僅僅有在nawk或較新的awk版本號中才干夠添加函數。
函數的使用包括兩部分:函數的定義與函數調用。
當中函數定義又包括要運行的代碼(函數本身)和從主程序代碼傳遞到該函數的暫時調用。
awk函數的定義方法例如以下:
function函數名(參數表){
函數體
}
在gawk中同意將function省略為func,但其他版本號的awk不同意。函數名必須是一個合法的標志符,參數表中能夠不提供參數(但在調用函數時函數名后的一對括號仍然是必不可少的)。也能夠提供一個或多個參數。與C語言相似。awk的參數也是通過值來傳遞的。
在awk中調用函數比較簡單,其方法與C語言相似,但awk比C語言更為靈活,它不運行參數有效性檢查。換句話說。在你調用函數時,能夠列出比函數估計(函數定義中規定)的多或少的參數,多余的參數會被awk所忽略。而不足的參數,awk將它們置為缺省值0或空字符串,詳細置為何值。將取決于參數的使用方式。
awk函數有兩種返回方式:隱式返回和顯式返回。當awk運行到函數的結尾時。它自己主動地返回到調用程序,這是函數是隱式返回的。假設須要在結束之前退出函數,能夠明白地使用返回語句提前退出。方法是在函數中使用形如:return返回值格式的語句。
例:以下的樣例演示了函數的使用。在這個演示樣例中,定義了一個名為print_header的函數,該函數調用了兩個參數FileName和PageNum,FileName參數傳給函數當前使用的文件名稱,PageNum參數是當前頁的頁號。
這個函數的功能是打印(顯示)出當前文件的文件名稱,和當前頁的頁號。完畢這個功能后。這個函數將返回下一頁的頁號。
nawk
>'BEGIN{pageno=1;file=FILENAME
>pageno=print_header(file。pageno);#調用函數print_header
>printf("當前頁頁號是:%d\n",pageno);
>}
>#定義函數print_header
>functionprint_header(FileName,PageNum){
>printf("%s%d\n",FileName,PageNum);
>PageNum++;
>returnPageNUm;
>}
>}' myfile
運行這個程序將顯演示樣例如以下內容:
myfile1
當前頁頁號是:2
10awk高級輸入輸出
10.1讀取下一條記錄:
awk的next語句導致awk讀取下一個記錄并完畢模式匹配。然后馬上運行對應的操作。通常它用匹配的模式運行操作中的代碼。next導致這個記錄的不論什么額外匹配模式被忽略。
10.2簡單地讀取一條記錄
awk的getline語句用于簡單地讀取一條記錄。假設用戶有一個數據記錄類似兩個物理記錄,那么getline將尤事實上用。它完畢一般字段的分離(設置字段變量$0FNR NFNR)。假設成功則返回1。失敗則返回0(到達文件尾)。假設需簡單地讀取一個文件,則能夠編寫下面代碼:
例:演示樣例getline的使用
{while(getline==1)
{
#processthe inputted fields
}
}
也能夠使getline保存輸入數據在一個字段中,而不是通過使用getlinevariable的形式處理一般字段。當使用這樣的方式時,NF被置成0,FNR和NR被增值。
用戶也能夠使用getline<"filename"方式從一個給定的文件里輸入數據,而不是從命令行所列內容輸入數據。此時。getline將完畢一般字段分離(設置字段變量$0和NF)。假設文件不存在。返回-1,成功,返回1,返回0表示失敗。用戶能夠從給定文件里讀取數據到一個變量中,也能夠用stdin(標準輸入設備)或一個包括這個文件名稱的變量取代filename。值得注意的是當使用這樣的方式時不改動FNR和NR。
還有一種使用getline語句的方法是從UNIX命令接受輸入,比如以下的樣例:
例:演示樣例從UNIX命令接受輸入
{while("who-u"|getline)
{
#process each line fromthe who command
}
}
當然,也能夠使用例如以下形式:
"command"| getline variable
10.3關閉文件:
awk中同意在程序中關閉一個輸入或輸出文件。方法是使用awk的close語句。
close("filename")
filename能夠是getline打開的文件(也能夠是stdin,包括文件名稱的變量或者getline使用的確切命令)。
或一個輸出文件(能夠是stdout。包括文件名稱的變量或使用管道的確切命令)。
10.4輸出到一個文件:
awk中同意用例如以下方式將結果輸出到一個文件:
printf("helloword!\n")>"datafile"
或
printf("helloword!\n")>>"datafile"
10.5輸出到一個命令
awk中同意用例如以下方式將結果輸出到一個命令:
printf("helloword!\n")|"sort-t','"
10awk與shellscript混合編程
由于awk能夠作為一個shell命令使用,因此awk能與shell批處理程序非常好的融合在一起,這給實現awk與shell程序的混合編程提供了可能。
實現混合編程的關鍵是awk與shellscript之間的對話。換言之,就是awk與shellscript之間的信息交流:awk從shellscript中獲取所需的信息(一般是變量的值)、在awk中運行shell命令行、shellscript將命令運行的結果送給awk處理以及shellscript讀取awk的運行結果等等。
10.1awk讀取Shellscript程序變量
在awk中我們能夠通過“'$變量名'”的方式讀取shellscrpit程序中的變量。
例:在以下的演示樣例中,我們將讀取sellscrpit程序中的變量Name,該變量存放的是文本myfile的撰寫者,awk將打印出這個人名。
$catwritename
# !/bin/sh
Name="張三"
awk'BEGIN {name="'$Name'";\
printf("\t%s\t撰寫者%s\n",FILENAME,name");}\
{...}END{...}' myfile
10.2將shell命令的運行結果送給awk處理
作為信息傳送的一種方法。我們能夠將一條shell命令的結果通過管道線(|)傳遞給awk處理:
例:演示樣例awk處理shell命令的運行結果
$who-u | awk '{printf("%s正在運行%s\n",$2,$1)}'
該命令將打印出注冊終端正在運行的程序名。
10.3shell script程序讀awk的運行結果
為了實現shellscript程序讀取awk運行的結果,我們能夠採取一些特殊的方法,比如我們能夠用變量名=`awk語句`的形式將awk運行的結果存放入一個shellscript變量。當然也能夠用管道線的方法將awk運行結果傳遞給shellscript程序處理。
例:作為傳送消息的機制之中的一個,UNIX提供了一個向其全部用戶傳送消息的命令wall(意思是writetoall寫給全部用戶),該命令同意向全部工作中的用戶(終端)發送消息。為此,我們能夠通過一段shell批處理程序wall.shell來模擬這一程序(其實比較老的版本號中wall就是一段shell批處理程序:
$catwall.shell
#!/bin/sh
who -u | awk '{print $2}' |while read tty
do
cat /tmp/$$>$tty #$$的作用是產生隨機的數字?
!!
done
在這個程序里。awk接受who-u命令的運行結果,該命令打印出全部已注冊終端的信息,當中第二個字段是已注冊終端的設備名,因此用awk命令析出該設備名。然后用whileread tty語句循環讀出這些文件名稱到變量(shellscript變量)tty中。作為信息傳送的終結地址。
10.4在awk中運行shell命令行----嵌入函數system()
system()是一個不適合字符或數字類型的嵌入函數,該函數的功能是處理作為參數傳遞給它的字符串。system對這個參數的處理就是將其作為命令處理,也就是說將其當作命令行一樣加以運行。
這使得用戶在自己的awk程序須要時能夠靈活地運行命令或腳本。
例:以下的程序將使用system嵌入函數打印用戶編制好的報表文件,這個文件存放在名為myreport.txt的文件里。為簡約起見,我們僅僅列出了其END部分:
.
.
.
END{close("myreport.txt");system("lpmyreport.txt");}
在這個演示樣例中,我們首先使用close語句關閉了文件myreport.txt文件。然后使用system嵌入函數將myreport.txt送入打印機打印。
寫到這里,我不得不跟朋友們說再見了,實在地說,這些內容仍然是awk的初步知識,電腦永遠是前進的科學。awk也不例外。本篇所能做的僅僅是在你前行的漫漫長途中鋪平一段小小開端。剩下的路還得靠你自己去走。
老實說,假設本文真能給你前行的路上帶來些許的方便,那本人就知足了!
如對本篇有不論什么疑問,請E-mailTo:Chizlong@yeah.net或到主頁http://chizling.yeah.net中留言。
附錄
附1awk的常規表達式元字符
\換碼序列
^在字符串的開頭開始匹配
$在字符串的結尾開始匹配
.與不論什么單個字符串匹配
[ABC]與[]內的任一字符匹配
[A-Ca-c]與A-C及a-c范圍內的字符匹配(按字母表順序)
[^ABC]與除[]內的全部字符以外的任一字符匹配
Desk|Chair與Desk和Chair中的任一個匹配
[ABC][DEF]關聯。與A、B、C中的任一字符匹配。且其后要跟D、E、F中的任一個字符。
*與A、B或C中任一個出現0次或多次的字符相匹配
+與A、B或C中不論什么一個出現1次或多次的字符相匹配
?與一個空串或A、B或C在不論什么一個字符相匹配
(Blue|Black)berry合并常規表達式,與Blueberry或Blackberry相匹配
附2awk算術運算符
運算符用途
------------------
x^yx的y次冪
x**y同上
x%y計算x/y的余數(求模)
x+yx加y
x-yx減y
x*yx乘y
x/yx除y
-y負y(y的開關符號);也稱一目減
++yy加1后使用y(前置加)
y++使用y值后加1(后綴加)
--yy減1后使用y(前置減)
y--使用后y減1(后綴減)
x=y將y的值賦給x
x+=y將x+y的值賦給x
x-=y將x-y的值賦給x
x*=y將x*y的值賦給x
x/=y將x/y的值賦給xx%=y 將x%y的值賦給x
x^=y將x^y的值賦給x
x**=y將x**y的值賦給x
附3awk同意的測試
操作符含義
x==yx等于y
x!=yx不等于y
x>yx大于y
x>=yx大于或等于y
x<yx小于y
x<=yx小于或等于y?
x~rex匹配正則表達式re?
x!~rex不匹配正則表達式re?
附4awk的操作符(按優先級升序排列)
=、+=、-=、*= 、/=、 %=
||
&&
>>= < <= == != ~ !~
xy (字符串連結,'x''y'變成"xy")
+-
* / %
++ --
附5awk內置變量(提前定義變量)
說明:表中v項表示第一個支持變量的工具(下同):A=awk,N=nawk,P=POSIXawk,G=gawk
變量含義缺省值
--------------------------------------------------------
ARGC命令行參數個數
ARGIND當前被處理文件的ARGV標志符
ARGV命令行參數數組
CONVFMT數字轉換格式%.6g
ENVIRONUNIX環境變量
ERRNOUNIX系統錯誤消息
FIELDWIDTHS輸入字段寬度的空白分隔字符串
FILENAME當前輸入文件的名字
FNR當前記錄數
FS輸入字段分隔符空格
IGNORECASE控制大寫和小寫敏感0(大寫和小寫敏感)
NF當前記錄中的字段個數
NR已經讀出的記錄數
OFMT數字的輸出格式%.6g
OFS輸出字段分隔符空格
ORS輸出的記錄分隔符新行
RS輸入的記錄他隔符新行
RSTART被匹配函數匹配的字符串首
RLENGTH被匹配函數匹配的字符串長度
SUBSEP下標分隔符"\034"
附6awk的內置函數
函數用途或返回值
------------------------------------------------
gsub(reg,string,target)每次常規表達式reg匹配時替換target中的string
index(search,string)返回string中search串的位置
length(string)求串string中的字符個數
match(string,reg)返回常規表達式reg匹配的string中的位置
printf(format,variable)格式化輸出,按format提供的格式輸出變量variable。
split(string,store,delim)依據分界符delim,分解string為store的數組元素
sprintf(format,variable)返回一個包括基于format的格式化數據。variables是要放到串中的數據
strftime(format,timestamp)返回一個基于format的日期或者時間串。timestmp是systime()函數返回的時間
sub(reg,string,target)第一次當常規表達式reg匹配,替換target串中的字符串
substr(string,position,len)返回一個以position開始len個字符的子串
tolower(string)返回string中相應的小寫字符
toupper(string)返回string中相應的大寫字符
atan(x,y)x的余切(弧度)
cos(x)x的余弦(弧度)
exp(x)e的x冪
int(x)x的整數部分
log(x)x的自然對數值
rand()0-1之間的隨機數
sin(x)x的正弦(弧度)
sqrt(x)x的平方根
srand(x)初始化隨機數發生器。假設忽略x,則使用system()
system()返回自1970年1月1日以來經過的時間(按秒計算)
參考資料
1、《精通UNIX》(《UnderstandingUNIX》[美]StanKelly-Bootle 著李永峰等譯電子工業出版社)
2、《unix使用指南》(第2版)(UsingUNIX(SecondEdition)SteveMoritsugu等原著張擁軍、韓柯、原小玲等譯電子工業出版社出版、發行)
3、unix聯機手冊:scoOpenSrever 5.05版.
4、感謝無名的網路資源提供者,因為你們辛勤而無私的勞動,INTERNET只是如此美妙!
版權聲明:本文博客原創文章。博客,未經同意,不得轉載。
轉載于:https://www.cnblogs.com/mengfanrong/p/4757440.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的AWK增强的文本处理shell特征--AWK完全手册的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT (Basic Level) Pr
- 下一篇: (转)浅谈HTML5与css3画饼图!