5,gawk實用程式

tonykorn97發表於2006-08-09
linux 工具――gawk

什麼是awk,什麼是nawk,什麼是gawk?

Awklinux/unix下的用來操縱資料和產生報告的程式語言。Nawk是新的版本,gawkgnu版本。資料可以來自標準輸入,一個或者多個檔案,或者其他命令的輸出。Awk可用於命令列的簡單操作,也可以寫入大的應用程式。因為awk可以操縱書籍,所以它是shell教本和管理小型資料庫中必須的工具。

Awk逐行掃描檔案,從第一行到最後一行,尋找匹配特定模組的行,並在這些行上執行“選擇”動作。如果一個模組沒有指定動作,這些配置的行就被顯示在螢幕上。如果一個動作沒有模板,所有被動作指定的行被處理。

Gawkgun awk程式語言工程的成果。

本章內容基於gawk

awk的格式

一個awk程式包括awk命令,程式結構,引用(或輸入檔案)和輸入檔案的名字。如果輸入檔案沒有被指定,輸入就來自標準輸入或鍵盤。

Awk結構由模板,動作或者模板和動作聯合組成。模板是由某種型別表示式的說明組成。如果沒有看見關鍵字if,但是你在評價表示式的時候想到了單詞if,這就是模板。動作是在大括號內被分號或者新的一行封的一個和多個說明。模板不能夠放在大括號中,由在斜槓中間的正規表示式和awk提供的操作中的一個或者幾個組成。

Awk命令可以從命令列中輸入,也可以從awk指令碼中輸入。輸入行可以來自檔案,管道和標準輸入。

命令格式:從檔案輸入

awk ‘pattern’ filename

awk ‘{action}’ filename

awk ‘pattern {action}’ filename

命令格式:從命令輸入

command | awk ‘pattern’

command | awk ‘{action}’

command | awk ‘pattern {action}’

例子:

[posftp@SZTrade posftp]$ df

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/sda6 50394964 14237672 33597336 30% /

/dev/sda3 101107 16228 79658 17% /boot

none 3991708 0 3991708 0% /dev/shm

tmpfs 1048576 1024000 24576 98% /informix.links/SZTrade/tmpfs

[posftp@SZTrade posftp]$ df | awk '$4>75000'

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/sda6 50394964 14237784 33597224 30% /

/dev/sda3 101107 16228 79658 17% /boot

none 3991708 0 3991708 0% /dev/shm

[posftp@SZTrade posftp]$

df報告檔案系統中的剩餘空間。Df 命令輸出透過管道傳送給awk。如果第四個域中的塊多於75000,則列印該行。

Awk命令列選項

Awk由很多的命令列選項。Gawk有兩種命令列選項格式:Gun長格式以雙橫線開始(--,後面緊跟著一個單詞;短的傳統POSIX格式,由一個橫線和一個字母組成。Grep使用-W選項或者相應的長格式。任何提供給長選項的引數貨殖用=連線(中間沒有空格),或者在下一命令列的引數內提供。

[posftp@SZTrade posftp]$ awk -help

Usage: awk [POSIX or GNU style options] -f progfile [--] file ...

Usage: awk [POSIX or GNU style options] [--] 'program' file ...

POSIX options: GNU long options:

-f progfile --file=progfile

-F fs --field-separator=fs

-v var=val --assign=var=val

-m[fr] val

-W compat --compat

-W copyleft --copyleft

-W copyright --copyright

-W dump-variables[=file] --dump-variables[=file]

-W gen-po --gen-po

-W help --help

-W lint[=fatal] --lint[=fatal]

-W lint-old --lint-old

-W non-decimal-data --non-decimal-data

-W profile[=file] --profile[=file]

-W posix --posix

-W re-interval --re-interval

-W source=program-text --source=program-text

-W traditional --traditional

-W usage --usage

-W version --version

To report bugs, see node `Bugs' in `gawk.info', which is

section `Reporting Problems and Bugs' in the printed version.

gawk is a pattern scanning and processing language.

By default it reads standard input and writes standard output.

Examples:

gawk '{ sum += $1 }; END { print sum }' file

gawk -F: '{ print $1 }' /etc/passwd

[posftp@SZTrade posftp]$

經常用的gawk命令列選項

-F fs 指定輸入檔案的分隔符,fs式一個字串貨殖一個正規表示式

-v var=value, 賦值一個使用者定義的變數,執行在awk指令碼前var,這樣在BEGIN塊中的變數就是合法的了。

-f scriptfile 從指令碼檔案中讀取awk命令。

格式輸出

列印函式

awk命令的動作部分式在小括號內的。如果沒有指定動作並且有模板被匹配,awk就執行預設動作,將所有匹配的行列印到螢幕。Print函式用來列印簡單且不需要特殊格式的輸出。要列印更為複雜和精確的格式,就需要使用printfsprintf函式了。

Print函式也可以直接用在awk命令的動作部分(print.print函式的引數可以是變數,數值或者字串。字串必須用雙引號引用,引數用逗號封。如果沒有逗號,引數就串連在一起而無法區分。

[posftp@SZTrade posftp]$ date

Tue Aug 8 14:43:54 CST 2006

[posftp@SZTrade posftp]$ date | awk '{print "month: " $2 "nYear: ",$6}'

month: Aug

Year: 2006

[posftp@SZTrade posftp]$

linuxdate命令輸出透過管道給awk。字串month:被列印,後面跟著換行符“n”的秒域和Year:最後是第六域($6.

換碼序列。換碼序列表現為一個反斜槓後面緊跟著一個字母或者數字。他們被用在字串中表示空格,新行及換頁等等

換碼序列

含義

b

Backspace

f

換頁

n

新行

r

回車

t

製表符

47

十進位制47,表示單引號

c

C表示其他任何字元

Awk ‘/Sally/{print “ttHave a nice day, “ $1,$2 “!!”}’ employees

如果某行包含模板Sally,print函式就列印兩個製表符,字串Have a nice day,第一個域(用$1表示)和第二個域(用$2表示)後面緊跟著一個包含靈感感嘆號的字串。

OFMT變數

在列印數字的時候你也許想控制數字的格式,我們通常用printf來完成這個功能。Awk的特殊變數OFMT也可以在使用print函式的時候,控制數字的列印格式。它的預設值是“%。6g”----小數點後面6位將被列印

[posftp@SZTrade posftp]$ awk 'BEGIN{OFMT="%.2f"; print 1.2456789,12E-2}'

1.25 0.12

[posftp@SZTrade posftp]$

OFMT變數被設定為浮點數(f)的小數點後面兩位被列印。百分號(%)用來說明指定的格式。

Printf函式

Printf函式返回一個列印到螢幕的格式化好的字串,就像c語言中關於printf的說明。Printf函式由被引用的控制字串組成,這個控制字串可以嵌入指定格式和改變數。控制字串緊跟著一個逗號和一串由逗號分割的表示式,這些表示式將按照控制字串指定的形式被格式化。跟print函式不同,printf函式不提供換行符,如果需要換行就必須寫換碼序列,n.

轉換字元

轉換字元

定義

c

字元

s

字串

d

十進位制數

ld

長十進位制數

u

無正負的十進位制數

lu

長的無正負之分的十進位制數

x

十六進位制數

lx

長十六進位制數

o

八進位制數

lo

長八進位制數

e

用科學計數法記錄的浮點數

f

浮點數

g

使用e 或者 f函式處理過的浮點數,佔用最少的空間

Printf修正符

字元

定義

-

左對齊

#

顯示八進位制數的時候以0開頭;顯示十六進位制數的時候以0x開頭

+

使用d,e,f或者g轉換一行,數字前面保持+或者-

0

0代替空格填補空白

格式化說明符

Printf格式化說明符

功能

(假設 x=A y=15 z=23. $1=Bob Smith

%c

列印單個ASCII字元

printf(“The character is %cn”,x)結果為:The character is A

%d

列印十進位制數

printf(“The boy is $d year oldn”,y)結果為:The boy is 15 year old

%e

列印用科學計數法表示的數

printf(“z is %en”,z)結果為:z is 2.3e+01

%f

打浮點數

printf(“z is %fn”,2.3*2)結果為:z is 4.600000

%o

列印八進位制數

printf(“y is %on”,y)結果為:y is 17

%s

列印字串

printf(“The name of the culprit is %sn”,$1)結果為:The name of the culprit is Bob Smith

%x

列印十六進位制數

printf(“y is %xn”,y)結果為:y is f

5.5記錄和域

5.5.1記錄

awk並不是把輸入檔案當作一個沒有終止的字串,而是看作具有一定格式和結構的。預設每一個以換行符結束的行稱做一個記錄。

記錄分割符。預設輸入和輸出的分隔符都是回車,儲存在awk內建變數ORSRS中,ORSRS的值可以在有限的範圍內修改。

$0變數。在awk$0指的是整條記錄(當發生替換或者賦值而使得$0的值發生改變時,NF的值和域的個數都會跟著發生變化)。換行符的值儲存在awk內建變數RS中,預設情況下回車。

變數NR。多個記錄的每一條都儲存在內建變數NR中。每處理完一個記錄,NR的值就增加1

5.5.2

記錄中的每一個單詞稱為“域”,預設情況下以空格或者tab分割。每一個單詞叫做一個域,awk跟蹤域的數量,並在內建變數NF中儲存這個數字。每一行的域的個數是不一樣的。典型限制為每行100個。

5.5.3 域分割符

輸入域分割符。Awk的內建變數FS儲存輸入域分割符的值。預設值是空格或者tab.可以在BEGIN語句中或者命令列上修改FS的值。

在命令列上修改域分割符。awk命令後面加上-F選項可以用來修改輸入檔案的域分割符。在-F後面的字串立刻就變成新的域分割符。包含元字串可以重新設定多個域分隔符。

使用多個域分割符。可以指定多個輸入分隔符,若域分隔符由多個字元組成,如FS,則該字串是一個放在方括號內的正規表示式。

例子:awk –F ‘ [ :t]’ ‘{print $1,$2,$3}’ employees2

輸出域分割符。預設的輸出分隔符是一個空格,儲存在awk內建變數OFS中。

5.6 模式與動作

5.6.1 模式

awk模式控制awk對輸入的檔案行所做的動作,一個模式包含正規表示式,條件表示式,或者二者的結合。當條件表示式為真的時候,預設動作是列印該行。當讀取一個模式表示式時,可以使用if語句。使用if時不需要花括號引用。這裡的if變成一個動作語句,語法結果發生了變化。

5.6.2 動作

花括號內的,用分號分割的語句稱為動作。如果模式在動作前面,模式決定什麼時候發出動作。動作可以是一個語句也可以是一組語句。語句之間用分號分割,也可以用換行符。

5.7 正規表示式

對於awk來說,正規表示式就是由斜槓之間的字元組成的模式。Awk支援用正規表示式元字元修改正規表示式。如果輸入行的字串匹配正規表示式,結果條件為真,則執行所有與模式捆綁在一起的動作,如果正規表示式被匹配但是沒有指定任何動作,則只列印該記錄。

5.8 指令碼檔案中的awk命令

當你有多個awk的模式/動作語句的時候,最簡單的辦法就是把它們放在一個指令碼檔案中。指令碼檔案是一個包含awk註釋和語句的檔案。如果語句和動作在同一行,則必須分號分割。若在不同的行則無需使用分號了。如果模式後面是動作,左花括號就必須與模式在同一行。註釋由#引導。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/312079/viewspace-245426/,如需轉載,請註明出處,否則將追究法律責任。

相關文章