必威电竞|足球世界杯竞猜平台

Awk
來源:互聯(lián)網(wǎng)

AWK是一個優(yōu)良的文本處理工具,Linuxunix環(huán)境中現(xiàn)有的功能最強大的數(shù)據(jù)處理引擎之一。這種編程及數(shù)據(jù)操作語言(其名稱得自于它的創(chuàng)始人阿爾佛雷德·艾侯、彼得·溫伯格和布萊恩·柯林漢姓氏的首個字母)的最大功能取決于一個人所擁有的知識。

awk經(jīng)過改進生成的新的版本nawk,gawk,現(xiàn)在默認linux系統(tǒng)下日常使用的是gawk,用命令可以查看正在應(yīng)用的awk的來源(ls -l /bin/awk )

特點

AWK是一種優(yōu)良的文本處理工具。它不僅是 Linux 中也是任何環(huán)境中現(xiàn)有的功能最強大的數(shù)據(jù)處理引擎之一。這種編程及數(shù)據(jù)操作語言(其名稱得自于它的創(chuàng)始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母)的最大功能取決于一個人所擁有的知識。AWK 提供了極其強大的功能:可以進行樣式裝入、流控制、數(shù)學(xué)運算符、進程控制語句甚至于內(nèi)置的變量和函數(shù)。它具備了一個完整的語言所應(yīng)具有的幾乎所有精美特性。實際上 AWK 的確擁有自己的語言:AWK 程序設(shè)計語言,三位創(chuàng)建者已將它正式定義為“樣式掃描和處理語言”。它允許您創(chuàng)建簡短的程序,這些程序讀取輸入文件、為數(shù)據(jù)排序、處理數(shù)據(jù)、對輸入執(zhí)行計算以及生成報表,還有無數(shù)其他的功能。

最簡單地說, AWK 是一種用于處理文本的編程語言工具。AWK 在很多方面類似于 shell 編程語言,盡管 AWK 具有完全屬于其本身的語法。它的設(shè)計思想來源于 SNOBOL4 、sed 、Marc Rochkind設(shè)計的有效性語言、語言工具 yacc 和 lex ,當然還從 C 語言中獲取了一些優(yōu)秀的思想。在最初創(chuàng)造 AWK 時,其目的是用于文本處理,并且這種語言的基礎(chǔ)是,只要在輸入數(shù)據(jù)中有模式匹配,就執(zhí)行一系列指令。該實用工具掃描文件中的每一行,查找與命令行中所給定內(nèi)容相匹配的模式。如果發(fā)現(xiàn)匹配內(nèi)容,則進行下一個編程步驟。如果找不到匹配內(nèi)容,則繼續(xù)處理下一行。

盡管操作可能會很復(fù)雜,但命令的語法始終是:

awk '{pattern + action}' 或者 awk 'pattern {action}'

其中 pattern 表示 AWK 在數(shù)據(jù)中查找的內(nèi)容,而 action 是在找到匹配內(nèi)容時所執(zhí)行的一系列命令?;ɡㄌ?({}) 不需要在程序中始終出現(xiàn),但它們用于根據(jù)特定的模式對一系列指令進行分組。

gawk 是 AWK 的 GNU 版本。

一般的unix作業(yè)系統(tǒng),本身即附有AWK,不同的UNIX作業(yè)系統(tǒng)所附的AWK其版本亦不盡相同,若讀者所使用的系統(tǒng)上未附有AWK,可通過 anonymous ftp 到下列地方取得:

phi./pub/gnu

ftp/UNIX/gnu

preppub/gnu

注 解:一種編程語言,因其模式匹配語法而特別有用,通常用于數(shù)據(jù)檢索和數(shù)據(jù)轉(zhuǎn)換。一個GNU版本稱為Gawk。

調(diào)用方式

awk提供了適應(yīng)多種需要的不同解決方案,它們是:

一、 awk命令行,你可以象使用普通unix命令一樣使用awk,在命令行中你也可以使用awk程序設(shè)計語言,雖然awk支持多行的錄入,但是錄入長長的命令行并保證其正確無誤卻是一件令人頭疼的事,因此,這種方法一般只用于解決簡單的問題。當然,你也可以在shell script程序中引用awk命令行甚至awk程序腳本。

二、使用-f選項調(diào)用awk程序。awk允許將一段awk程序?qū)懭胍粋€文本文件,然后在awk命令行中用-f選項調(diào)用并執(zhí)行這段程序。具體的方法我們將在后面的awk語法中講到。

三、利用命令解釋器調(diào)用awk程序:利用unix支持的命令解釋器功能,我們可以將一段awk程序?qū)懭胛谋疚募?,然后在它的第一行加上?/p>

#!/bin/awk -f

并賦予這個文本文件以執(zhí)行的權(quán)限。這樣做之后,你就可以在命令行中用類似于下面這樣的方式調(diào)用并執(zhí)行這段awk程序了。

awk腳本文本名 待處理文件

語法

與其它UNIX命令一樣,awk擁有自己的語法:

awk [ -F re] [parameter...] ['prog'] [-f progfile]

參數(shù)說明:

-F re:允許awk更改其字段分隔符。

parameter: 該參數(shù)幫助為不同的變量賦值。

'prog': awk的程序語句段。這個語句段必須用單括號:'和'括起,以防被殼層解釋。這個程序語句段的標準形式為:

'pattern {action}'

其中pattern參數(shù)可以是egrep正則表達式中的任何一個,它可以使用語法/re/再加上一些樣式匹配技巧構(gòu)成。與SED類似,你也可以使用"," 分開兩樣式以選擇某個范圍。關(guān)于匹配的細節(jié),你可以參考附錄,如果仍不懂的話,找本unix書學(xué)學(xué)grep和sed(本人是在學(xué)習(xí)sed時掌握匹配技術(shù)的)。action參數(shù)總是被大括號包圍,它由一系列awk語句組成,各語句之間用";"分隔。awk解釋它們,并在pattern給定的樣式匹配的記錄上執(zhí)行其操作。與殼層類似,你也可以使用“#”作為注釋符,它使“#”到行尾的內(nèi)容成為注釋,在解釋執(zhí)行時,它們將被忽略。你可以省略pattern和 action之一,但不能兩者同時省略,當省略pattern時沒有樣式匹配,表示對所有行(記錄)均執(zhí)行操作,省略action時執(zhí)行缺省的操作——在標準輸出上顯示。

-f progfile:允許awk調(diào)用并執(zhí)行progfile指定有程序文件。progfile是一個文本文件,他必須符合awk的語法。

in_file:awk的輸入文件,awk允許對多個輸入文件進行處理。值得注意的是awk不修改輸入文件。如果未指定輸入文件,awk將接受標準輸入,并將結(jié)果顯示在標準輸出上。awk支持輸入輸出重定向。

內(nèi)置變量

前面說過,awk處理的工作與數(shù)據(jù)庫的處理方式有相同之處,其相同處之一就是awk支持對記錄和字段的處理,其中對字段的處理是grep和sed不能實現(xiàn)的,這也是awk優(yōu)于二者的原因之一。在awk中,缺省的情況下總是將文本文件中的一行視為一個記錄,而將一行中的某一部分作為記錄中的一個字段。為了操作這些不同的字段,awk借用殼層的方法,用1,2,3...這樣的方式來順序地表示行(記錄)中的不同字段。特殊地,awk用0表示整個行(記錄)。不同的字段之間是用稱作分隔符的字符分隔開的。系統(tǒng)默認的分隔符是空格。awk允許在命令行中用-F re的形式來改變這個分隔符。事實上,awk用一個內(nèi)置的變量RS來記憶這個分隔符。awk中有好幾個這樣的內(nèi)置變量,例如,記錄分隔符變量RS、當前工作的記錄數(shù)NR等等,本文后面的附表列出了全部的內(nèi)置變量。這些內(nèi)置的變量可以在awk程序中引用或修改,例如,你可以利用NR變量在模式匹配中指定工作范圍,也可以通過修改記錄分隔符RS讓一個特殊字符而不是換行符作為記錄的分隔符。

例:顯示文本文件myfile中第七行到第十五行中以字符%分隔的第一字段,第三字段和第七字段:

awk -F % 'NR>=7,NR<=15 {print $1 $3 $7}' myfile

介紹

awk提供了有很多內(nèi)置變量,如果你經(jīng)常使用awk處理文本,了解這些內(nèi)置變量的使用是很有必要的。下面看一下這些內(nèi)置變量的詳細介紹。

ARGC命令行參數(shù)個數(shù)(不包括awk的選項和awk的程序內(nèi)容)。

ARGIND 當前正在處理的ARGV中的文件的索引值(同時處理多個文件時會用到)。

ARGV 命令行參數(shù)序列數(shù)組,下標從0開始。

CONVFMT 數(shù)字轉(zhuǎn)換格式,和c語言中的數(shù)字輸出格式化類似,默認為"%.6g"。

ENVIRON 當前系統(tǒng)的環(huán)境變量。

ERRNO 出錯時的錯誤信息。

FIELDWIDTHS 以空格分隔的字段寬度,如果指定此變量,awk將會用指定的寬度替換變量FS指定的分隔符??聪旅娴睦樱?/p>

[LinuxSong@test /tmp]$ cat t

abcdefasfa

abcdefasfa

abcdefasfa

[LinuxSong@test /tmp]$ awk 'BEGIN {FIELDWIDTHS="2 3 4"}{print $1,$2,$3}' t

ab cde fasf

ab cde fasf

ab cde fasf

FILENAME 當前正在處理的文件名,該變量不能在BEGIN塊中使用。

FNR當前處理的記錄號。

FS 字段的分隔符,默認為空格。

IGNORECASE 如果該變量設(shè)置為非0值,在進行字符串匹配時忽略大小寫。

NF 當前記錄中的字段個數(shù)。

NR 已經(jīng)讀出的記錄數(shù)。

OFMT 數(shù)字的輸出格式。

OFS 輸出的字段分隔符,默認為空格。

ORS 輸出的記錄分隔符,默認為新行。

RS 輸入記錄的分隔符,默認為新行。

RSTART 被match()函數(shù)匹配的字符串的起始位置,如果沒有匹配則為0(從1開始)。

RLENGTH 被match()函數(shù)匹配的字符串的長度。

SUBSEP數(shù)組中多個下標的分隔符,默認為"\034"。

內(nèi)置函數(shù)

awk 之所以成為一種優(yōu)秀的程序設(shè)計語言的原因之一是它吸收了某些優(yōu)秀的程序設(shè)計語言(例如C)語言的許多優(yōu)點。這些優(yōu)點之一就是內(nèi)置函數(shù)的使用,awk定義并支持了一系列的內(nèi)置函數(shù),由于這些函數(shù)的使用,使得awk提供的功能更為完善和強大,例如,awk使用了一系列的字符串處理內(nèi)置函數(shù)(這些函數(shù)看起來與C 語言的字符串處理函數(shù)相似,其使用方式與c語言中的函數(shù)也相差無幾),正是由于這些內(nèi)置函數(shù)的使用,使awk處理字符串的功能更加強大。本文后面的附錄中列有一般的awk所提供的內(nèi)置函數(shù),這些內(nèi)置函數(shù)也許與你的awk版本有些出入,因此,在使用之前,最好參考一下你的系統(tǒng)中的聯(lián)機幫助。

內(nèi)置的字符串函數(shù)

gsub函數(shù)有點類似于sed查找和替換。它允許替換一個字符串或字符為另一個字符串或字符,并以正則表達式的形式執(zhí)行。第一個函數(shù)作用于記錄$0,第二個gsub函數(shù)允許指定目標,然而,如果未指定目標,缺省為$0。

index(s,t)函數(shù)返回目標字符串s中查詢字符串t的首位置。length函數(shù)返回字符串s字符長度。

match函數(shù)測試字符串s是否包含一個正則表達式r定義的匹配。

split使用域分隔符fs將字符串s劃分為指定序列a。

sprint函數(shù)類似于printf函數(shù),返回基本輸出格式fmt的結(jié)果字符串exp。

sub(r,s)函數(shù)將用s替代$0中最左邊最長的子串,該子串被r匹配。

substr(s,p)返回字符串s在位置p后的后綴。

substr(s,p,n)同上,并指定子串長度為n。

使用

命令行

按照順序,我們應(yīng)當講解awk程序設(shè)計的內(nèi)容了,但在講解之前,我們將用一些例子來對前面的知識進行回顧,這些例子都是在命令行中使用的,由此我們可以知道在命令行中使用awk是多么的方便。這樣做的原因一方面是為下面的內(nèi)容作鋪墊,另一方面是介紹一些解決簡單問題的方法,我們完全沒有必要用復(fù)雜的方法來解決簡單的問題----既然awk提供了較為簡單的方法的話。

例:顯示文本文件mydoc匹配(含有)字符串"sun"的所有行。

awk '/sun/' mydoc

由于顯示整個記錄(全行)是awk的缺省動作,因此可以省略action項。

awk '/sun/' mydoc

例:下面是一個較為復(fù)雜的匹配的示例:

awk '/[Ss]un/,/[Mm]oon/ ' myfile

它將顯示所有匹配Sun或sun的行與匹配Moon或moon的行之間的行,并顯示到標準輸出上。

例:下面的示例顯示了內(nèi)置變量和內(nèi)置函數(shù)length()的使用:

awk 'length($0)>80 {print NR}' myfile

該命令行將顯示文本myfile中所有超過80個字符的行號,在這里,用0表示整個記錄(行),同時,內(nèi)置變量NR不使用標志符''。

例:作為一個較為實際的例子,我們假設(shè)要對unix中的用戶進行安全性檢查,方法是考察/etc下的passwd文件,檢查其中的passwd字段(第二字段)是否為"*",如不為"*",則表示該用戶沒有設(shè)置密碼,顯示出這些用戶名(第一字段)。我們可以用如下語句實現(xiàn):

#awk -F : '$2!="*" {printf("%s no password!\n",$1)}' /etc/passwd

在這個示例中,passwd文件的字段分隔符是“:”,因此,必須用-F:來更改默認的字段分隔符,這個示例中也涉及到了內(nèi)置函數(shù)printf的使用。

變量

如同其它程序設(shè)計語言一樣,awk允許在程序語言中設(shè)置變量,事實上,提供變量的功能是程序設(shè)計語言的基本要求。

awk 提供兩種變量,一種是awk內(nèi)置的變量,這前面我們已經(jīng)講過,需要著重指出的是,與后面提到的其它變量不同的是,在awk程序中引用內(nèi)置變量不需要使用標志符""(回憶一下前面講過的NR的使用)。awk提供的另一種變量是自定義變量。awk允許用戶在awk程序語句中定義并調(diào)用自已的變量。當然這種變量不能與內(nèi)置變量及其它awk保留字相同,在awk中引用自定義變量必須在它前面加上標志符""。與c語言不同的是,awk中不需要對變量進行初始化, awk根據(jù)其在awk中第一次出現(xiàn)的形式和上下文確定其具體的數(shù)據(jù)類型。當變量類型不確定時,awk默認其為字符串類型。這里有一個技巧:如果你要讓你的 awk程序知道你所使用的變量的明確類型,你應(yīng)當在在程序中給它賦初值。在后面的實例中,我們將用到這一技巧。

運算與判斷

作為一種程序設(shè)計語言所應(yīng)具有的特點之一,awk支持多種運算,這些運算與C語言提供的基本相同:如+、-、*、/、%等等,同時,awk也支持C語言中類似++、--、+=、-=、=+、=-之類的功能,這給熟悉C語言的使用者編寫awk程序帶來了極大的方便。作為對運算功能的一種擴展,awk還提供了一系列內(nèi)置的運算函數(shù)(如log、sqr、cos、sin等等)和一些用于對字符串進行操作(運算)的函數(shù)(如length、substr等等)。這些函數(shù)的引用大大的提高了awk的運算功能。

作為對條件轉(zhuǎn)移指令的一部分,關(guān)系判斷是每種程序設(shè)計語言都具備的功能,awk也不例外。awk 中允許進行多種測試,如常用的==(等于)、!=(不等于)、>(大于)、>=(大于等于)、<=(小于等于)等等,同時,作為樣式匹配,還提供了~(匹配于)和!~(不匹配于)判斷。

作為對測試的一種擴充,awk也支持用邏輯運算符:?。ǚ牵?、&&;(與)、||(或)和括號()進行多重判斷,這大大增強了awk的功能。本文的附錄中列出了awk所允許的運算、判斷以及操作符的優(yōu)先級。

流程控制

流程控制語句是任何程序設(shè)計語言都不能缺少的部分。任何好的語言都有一些執(zhí)行流程控制的語句。awk提供的完備的流程控制語句類似于c語言,這給我們編程帶來了極大的方便。

1

在awk 中兩個特別的表達式,BEGIN和END,這兩者都可用于pattern中(參考前面的awk語法),提供BEGIN和END的作用是給程序賦予初始狀態(tài)和在程序結(jié)束之后執(zhí)行一些掃尾的工作。任何在BEGIN之后列出的操作(在{}內(nèi))將在awk開始掃描輸入之前執(zhí)行,而END之后列出的操作將在掃描完全部的輸入之后執(zhí)行。因此,通常使用BEGIN來顯示變量和預(yù)置(初始化)變量,使用END來輸出最終結(jié)果。

例:累計銷售文件xs中的銷售金額(假設(shè)銷售金額在記錄的第三字段):

awk

>'BEGIN { FS=":";print "統(tǒng)計銷售金額";total=0}

>{print $3;道達爾公司=total+$3;}

>END {printf "銷售金額總計:%.2f",total}' sx

(注:>;是殼層提供的第二提示符,如要在shell程序awk語句和awk語言中換行,則需在行尾加反斜杠\)

在這里,BEGIN預(yù)置了內(nèi)部變量FS(字段分隔符)和自定義變量total,同時在掃描之前顯示出輸出行頭。而END則在掃描完成后打印出總合計。

2

awk提供了完備的流程控制語句,其用法與c語言類似。下面我們一一加以說明:

2.1、if...else語句:

格式:

if(表達式)

語句1

else

語句2

格式中"語句1"可以是多個語句,如果你為了方便awk判斷也方便你自已閱讀,你最好將多個語句用{}括起來。awk分枝結(jié)構(gòu)允許嵌套,其格式為:

if(表達式1)

{if(表達式2)

語句1

else

語句2

}

語句3

else {if(表達式3)

語句4

else

語句5

}

語句6

當然實際操作過程中你可能不會用到如此復(fù)雜的分枝結(jié)構(gòu),這里只是為了給出其樣式罷了。

2.2、while語句

格式為:

while(表達式)

語句

2.3、do-while語句

格式為:

do

{

語句

}while(條件判斷語句)

2.4、for語句

格式為:

for(初始表達式;終止條件;步長表達式)

{語句}

在awk 的 while、do-while和for語句中允許使用break,continue語句來控制流程走向,也允許使用exit這樣的語句來退出。break 中斷當前正在執(zhí)行的循環(huán)并跳到循環(huán)外執(zhí)行下一條語句。continue從當前位置跳到循環(huán)開始處執(zhí)行。對于exit的執(zhí)行有兩種情況:當exit語句不在 END中時,任何操作中的exit命令表現(xiàn)得如同到了文件尾,所有模式或操作執(zhí)行將停止,END模式中的操作被執(zhí)行。而出現(xiàn)在END中的exit將導(dǎo)致程序終止。

函數(shù)

定義和調(diào)用用戶自己的函數(shù)是幾乎每個高級語言都具有的功能,awk也不例外,但原始的awk并不提供函數(shù)功能,只有在nawk或較新的awk版本中才可以增加函數(shù)。

函數(shù)的使用包含兩部分:函數(shù)的定義與函數(shù)調(diào)用。其中函數(shù)定義又包括要執(zhí)行的代碼(函數(shù)本身)和從主程序代碼傳遞到該函數(shù)的臨時調(diào)用。

awk函數(shù)的定義方法如下:

函數(shù) 函數(shù)名(參數(shù)表){

函數(shù)體

}

在gawk中允許將function省略為func,但其它版本的awk不允許。函數(shù)名必須是一個合法的標志符,參數(shù)表中可以不提供參數(shù)(但在調(diào)用函數(shù)時函數(shù)名后的一對括號仍然是不可缺少的),也可以提供一個或多個參數(shù)。與c語言相似,awk的參數(shù)也是通過值來傳遞的。

在awk 中調(diào)用函數(shù)比較簡單,其方法與C語言相似,但awk比C語言更為靈活,它不執(zhí)行參數(shù)有效性檢查。換句話說,在你調(diào)用函數(shù)時,可以列出比函數(shù)預(yù)計(函數(shù)定義中規(guī)定)的多或少的參數(shù),多余的參數(shù)會被awk所忽略,而不足的參數(shù),awk將它們置為缺省值0或空字符串,具體置為何值,將取決于參數(shù)的使用方式。

awk函數(shù)有兩種返回方式:隱式返回和顯式返回。當awk執(zhí)行到函數(shù)的結(jié)尾時,它自動地返回到調(diào)用程序,這是函數(shù)是隱式返回的。如果需要在結(jié)束之前退出函數(shù),可以明確地使用返回語句提前退出。方法是在函數(shù)中使用形如:return 返回值 格式的語句。

例:下面的例子演示了函數(shù)的使用。在這個示例中,定義了一個名為print_header的函數(shù),該函數(shù)調(diào)用了兩個參數(shù)FileName和 PageNum, FileName參數(shù)傳給函數(shù)當前使用的文件名,PageNum參數(shù)是當前頁的頁號。這個函數(shù)的功能是打?。@示)出當前文件的文件名,和當前頁的頁號。完成這個功能后,這個函數(shù)將返回下一頁的頁號。

nawk

>'BEGIN{pageno=1;file=FILENAME

>pageno=print_header(file,pageno);#調(diào)用函數(shù)print_header

>printf("當前頁頁號是:%d\n",pageno);

>}

>#定義函數(shù)print_header

>函數(shù) print_header(FileName,PageNum){

>printf("%s %d\n",FileName,PageNum); >PageNum++;return PageNUm;

>}

>}' myfile

執(zhí)行這個程序?qū)@示如下內(nèi)容:

myfile 1

當前頁頁號是:2

輸入輸出

1.讀取下一條記錄:

awk的next語句導(dǎo)致awk讀取下一個記錄并完成模式匹配,然后立即執(zhí)行相應(yīng)的操作。通常它用匹配的模式執(zhí)行操作中的代碼。next導(dǎo)致這個記錄的任何額外匹配模式被忽略。

2.簡單地讀取一條記錄

awk 的 getline語句用于簡單地讀取一條記錄。如果用戶有一個數(shù)據(jù)記錄類似兩個物理記錄,那么getline將尤其有用。它完成一般字段的分離(設(shè)置字段變量0FNRNF NR)。如果成功則返回1,失敗則返回0(到達文件尾)。如果需簡單地讀取一個文件,則可以編寫以下代碼:

例:示例getline的使用

{while(getline==1)

{

#process the inputted fields

}

}

也可以使getline保存輸入數(shù)據(jù)在一個字段中,而不是通過使用getline variable的形式處理一般字段。當使用這種方式時,NF被置成0,F(xiàn)NR和NR被增值。

用戶也可以使用getline"datafile"

printf("hello word!\n"

>>"datafile"

3. 輸出記錄

可以通過print 和 printf 將結(jié)果輸出:

awk '{ print $1,$2 }' file

4.輸出到一個命令

awk中允許用如下方式將結(jié)果輸出到一個命令:

printf("hello word!\n"

|"sort-t','"

awk與殼層 script混合編程

因為awk可以作為一個shell命令使用,因此awk能與shell批處理程序很好的融合在一起,這給實現(xiàn)awk與shell程序的混合編程提供了可能。實現(xiàn)混合編程的關(guān)鍵是awk與shell script之間的對話,換言之,就是awk與shell script之間的信息交流:awk從shell script中獲取所需的信息(通常是變量的值)、在awk中執(zhí)行shell命令行、shell script將命令執(zhí)行的結(jié)果送給awk處理以及殼層 scrit讀取awk的執(zhí)行結(jié)果等等。

1.awk讀取Shell script程序變量

在awk中我們可以通過“'$變量名'”的方式讀取sell scrpit程序中的變量。

例:在下面的示例中,我們將讀取sell scrpit程序中的變量Name,該變量存放的是文本myfile的撰寫者,awk將打印出這個人名。

$cat writename

:

# @(#)

#

Name="張三" nawk 'BEGIN {name="'Name'";\ printf("\t%s\t撰寫者%s\n",FILENAME,name");}\

{...}END{...}' myfile

2.將殼層命令的執(zhí)行結(jié)果送給awk處理

作為信息傳送的一種方法,我們可以將一條shell命令的結(jié)果通過管道線(|)傳遞給awk處理:

例:示例awk處理shell命令的執(zhí)行結(jié)果

$who -u | awk '{printf("%s正在執(zhí)行%s\n",$2,$1)}'

該命令將打印出注冊終端正在執(zhí)行的程序名。

3.shell script程序讀awk的執(zhí)行結(jié)果

為了實現(xiàn)shell script程序讀取awk執(zhí)行的結(jié)果,我們可以采取一些特殊的方法,例如我們可以用變量名=`awk語句`的形式將awk執(zhí)行的結(jié)果存放入一個shell script變量。當然也可以用管道線的方法將awk執(zhí)行結(jié)果傳遞給殼層 script程序處理。

例:作為傳送消息的機制之一,unix提供了一個向其所有用戶傳送消息的命令wall(意思是write to all寫給所有用戶),該命令允許向所有工作中的用戶(終端)發(fā)送消息。為此,我們可以通過一段shell批處理程序wall.shell來模擬這一程序(事實上比較老的版本中wall就是一段shell批處理程序:

$cat wall.shell

:

# @(#) wall.shell:發(fā)送消息給每個已注冊終端

#

cat >/tmp/$$

#用戶錄入消息文本who -u | awk '{print $2}' | while read tty

do

cat /tmp/$$>$tty

done

在這個程序里,awk接受who -u命令的執(zhí)行結(jié)果,該命令打印出所有已注冊終端的信息,其中第二個字段是已注冊終端的設(shè)備名,因此用awk命令析出該設(shè)備名,然后用while read tty語句循環(huán)讀出這些文件名到變量(shell script變量)tty中,作為信息傳送的終結(jié)地址。

4.在awk中執(zhí)行shell命令行----嵌入函數(shù)system()

system()是一個不適合字符或數(shù)字類型的嵌入函數(shù),該函數(shù)的功能是處理作為參數(shù)傳遞給它的字符串。system對這個參數(shù)的處理就是將其作為命令處理,也就是說將其當作命令行一樣加以執(zhí)行。這使得用戶在自己的awk程序需要時可以靈活地執(zhí)行命令或腳本。

例:下面的程序?qū)⑹褂胹ystem嵌入函數(shù)打印用戶編制好的報表文件,這個文件存放在名為myreport.txt的文件中。為簡約起見,我們只列出了其END部分:

END {close("myreport.txt");system("lp myreport.txt");}

在這個示例中,我們首先使用close語句關(guān)閉了文件myreport.txt文件,然后使用system嵌入函數(shù)將myreport.txt送入打印機打印。

命令

Awk是一種可以對文本和數(shù)據(jù)進行處理的編程語言,1977年由Alfred Aho、Peter Weinberger和Brian Kernighan開發(fā)而來。Awk的名字是由三位開發(fā)者的姓氏首字母構(gòu)成。Awk的各種變形(nawk和gawk等等)幾乎支持所有的Linux版本,并且可以簡單地從命令行使用。作為一個強大的命令行工具也意味著awk對于Secure Shell也是有效的。

Awk編程語言用于處理文本文件。Awk在默認情況下,Awk文件的每一行都被視為一個記錄。然后Awk記錄進一步分解成一系列的字段。Awk程序就是一系列作用在記錄和字段上的“識別-執(zhí)行”操作語句。Awk以順序方式閱讀文件,當響應(yīng)特定模式時,會提示相關(guān)動作。

Awk組合

你可以將某些Awk匹配進行組合。再舉個例子,如果你想找到包含字符串“220”的行并打印出文件大小和名稱,Awk命令可以如下:

awk '/220/ {print $5 " " $9}' rob-list.txt

Awk輸出如下:

220 rob3.data

220 rob.data

當你使用Awk匹配選項 '/ 目標字符串 /' 時,awk命令將對文本文件的每一行進行字符串匹配。不難想象,除了打印出來的Awk字段,其他Awk字段也有可能包含220字符串。即使Awk文件大小字段(第5字段)中不包含220,Awk匹配結(jié)果仍然會顯示出來。

將awk投入到實際工作中

在一些Awk物聯(lián)網(wǎng)項目中,需要在平臺和應(yīng)用程序之間移動Awk數(shù)據(jù),這時我會用到awk。例如,我已經(jīng)將DS18B20數(shù)字溫度傳感器的數(shù)據(jù)通過Arduino運行,將Awk文本數(shù)據(jù)通過XBee radios輸出到Linux筆記本。使用cat命令查詢USB接口將數(shù)據(jù)傳輸?shù)焦P記本,然后Awk重定向到一個文本文件。

這些Awk數(shù)據(jù)代表兩個不同的傳感器“a001”和“a002”上的每秒溫度讀數(shù)。我用awk進行獨立閱讀,并把Awk放在Linux筆記本上kst繪圖工具里。

我用下面的awk命令為kst繪圖工具準備數(shù)據(jù)。

awk -F "|" '{print $3","$4}' < rob.data > rob2.data

Awk數(shù)據(jù)輸出現(xiàn)在只有X和Y坐標,中間由一個逗號分開,符合kst顯示

參考資料 >

生活家百科家居網(wǎng)