1. awk簡(jiǎn)介 -F fs or --field-separator fs -W posix -W re-interval or --re-inerval -W source program-text or --source program-text -W version or --version
2. awk命令格式和選項(xiàng)
3. 模式和操作
4. awk的環(huán)境變量
5. awk運(yùn)算符
6. 記錄和域
7. gawk專(zhuān)用正則表達(dá)式元字符
8. POSIX字符集
9. 匹配操作符(~)
10. 比較表達(dá)式
11. 范圍模板
12. 一個(gè)驗(yàn)證passwd文件有效性的例子
13. 幾個(gè)實(shí)例
14. awk編程
15. How-to
正文
1. awk簡(jiǎn)介
2. awk命令格式和選項(xiàng)
awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)
指定輸入文件折分隔符,fs是一個(gè)字符串或者是一個(gè)正則表達(dá)式,如-F:。
-v var=value or --asign var=value
賦值一個(gè)用戶(hù)定義變量。
-f scripfile or --file scriptfile
從腳本文件中讀取awk命令。
-mf nnn and -mr nnn
對(duì)nnn值設(shè)置內(nèi)在限制,-mf選項(xiàng)限制分配給nnn的最大塊數(shù)目;-mr選項(xiàng)限制記錄的最大數(shù)目。這兩個(gè)功能是Bell實(shí)驗(yàn)室版awk的擴(kuò)展功能,在標(biāo)準(zhǔn)awk中不適用。
-W compact or --compat, -W traditional or --traditional
在兼容模式下運(yùn)行awk。所以gawk的行為和標(biāo)準(zhǔn)的awk完全一樣,所有的awk擴(kuò)展都被忽略。
-W copyleft or --copyleft, -W copyright or --copyright
打印簡(jiǎn)短的版權(quán)信息。
-W help or --help, -W usage or --usage
打印全部awk選項(xiàng)和每個(gè)選項(xiàng)的簡(jiǎn)短說(shuō)明。
-W lint or --lint
打印不能向傳統(tǒng)unix平臺(tái)移植的結(jié)構(gòu)的警告。
-W lint-old or --lint-old
打印關(guān)于不能向傳統(tǒng)unix平臺(tái)移植的結(jié)構(gòu)的警告。
打開(kāi)兼容模式。但有以下限制,不識(shí)別:\x、函數(shù)關(guān)鍵字、func、換碼序列以及當(dāng)fs是一個(gè)空格時(shí),將新行作為一個(gè)域分隔符;操作符**和**=不能代替^和^=;fflush無(wú)效。
允許間隔正則表達(dá)式的使用,參考(grep中的Posix字符類(lèi)),如括號(hào)表達(dá)式[[:alpha:]]。
使用program-text作為源代碼,可與-f命令混用。
打印bug報(bào)告信息的版本。
3. 模式和操作
pattern {action} 如$ awk '/root/' test,或$ awk '$3 < 100' test
4. awk的環(huán)境變量
Table 1. awk的環(huán)境變量
變量 | 描述 |
$n | 當(dāng)前記錄的第n個(gè)字段,字段間由FS分隔。 |
$0 | 完整的輸入記錄。 |
ARGC | 命令行參數(shù)的數(shù)目。 |
ARGIND | 命令行中當(dāng)前文件的位置(從0開(kāi)始算)。 |
ARGV | 包含命令行參數(shù)的數(shù)組。 |
CONVFMT | 數(shù)字轉(zhuǎn)換格式(默認(rèn)值為%.6g) |
ENVIRON | 環(huán)境變量關(guān)聯(lián)數(shù)組。 |
ERRNO | 最后一個(gè)系統(tǒng)錯(cuò)誤的描述。 |
FIELDWIDTHS | 字段寬度列表(用空格鍵分隔)。 |
FILENAME | 當(dāng)前文件名。 |
FNR | 同NR,但相對(duì)于當(dāng)前文件。 |
FS | 字段分隔符(默認(rèn)是任何空格)。 |
IGNORECASE | 如果為真,則進(jìn)行忽略大小寫(xiě)的匹配。 |
NF | 當(dāng)前記錄中的字段數(shù)。 |
NR | 當(dāng)前記錄數(shù)。 |
OFMT | 數(shù)字的輸出格式(默認(rèn)值是%.6g)。 |
OFS | 輸出字段分隔符(默認(rèn)值是一個(gè)空格)。 |
ORS | 輸出記錄分隔符(默認(rèn)值是一個(gè)換行符)。 |
RLENGTH | 由match函數(shù)所匹配的字符串的長(zhǎng)度。 |
RS | 記錄分隔符(默認(rèn)是一個(gè)換行符)。 |
RSTART | 由match函數(shù)所匹配的字符串的第一個(gè)位置。 |
SUBSEP | 數(shù)組下標(biāo)分隔符(默認(rèn)值是\034)。 |
5. awk運(yùn)算符
Table 2. 運(yùn)算符
運(yùn)算符 | 描述 |
= += -= *= /= %= ^= **= | 賦值 |
: | C條件表達(dá)式 |
|| | 邏輯或 |
&& | 邏輯與 |
~ ~! | 匹配正則表達(dá)式和不匹配正則表達(dá)式 |
< <= > >= != == | 關(guān)系運(yùn)算符 |
空格 | 連接 |
+ - | 加,減 |
* / & | 乘,除與求余 |
+ - ! | 一元加,減和邏輯非 |
^ *** | 求冪 |
++ -- | 增加或減少,作為前綴或后綴 |
$ | 字段引用 |
in | 數(shù)組成員 |
6. 記錄和域
7. gawk專(zhuān)用正則表達(dá)式元字符
\Y
匹配一個(gè)單詞開(kāi)頭或者末尾的空字符串。
\B
匹配單詞內(nèi)的空字符串。
\<
匹配一個(gè)單詞的開(kāi)頭的空字符串,錨定開(kāi)始。
\>
匹配一個(gè)單詞的末尾的空字符串,錨定末尾。
\w
匹配一個(gè)字母數(shù)字組成的單詞。
\W
匹配一個(gè)非字母數(shù)字組成的單詞。
\‘
匹配字符串開(kāi)頭的一個(gè)空字符串。
\'
匹配字符串末尾的一個(gè)空字符串。
8. POSIX字符集
待完善
9. 匹配操作符(~)
用來(lái)在記錄或者域內(nèi)匹配正則表達(dá)式。如$ awk '$1 ~/^root/' test將顯示test文件第一列中以root開(kāi)頭的行。
10. 比較表達(dá)式
conditional expression1 ? expression2: expression3 |
例如:
$ awk '{max = {$1 > $3} ? $1: $3: print max}' test |
如果第一個(gè)域大于第三個(gè)域,$1就賦值給max,否則$3就賦值給max。
$ awk '$1 + $2 < 100' test |
如果第一和第二個(gè)域相加大于100,則打印這些行。
$ awk '$1 > 5 && $2 < 10' test |
如果第一個(gè)域大于5,并且第二個(gè)域小于10,則打印這些行。
11. 范圍模板
范圍模板匹配從第一個(gè)模板的第一次出現(xiàn)到第二個(gè)模板的第一次出現(xiàn)之間所有行。如果有一個(gè)模板沒(méi)出現(xiàn),則匹配到開(kāi)頭或末尾。如$ awk '/root/,/mysql/' test將顯示root第一次出現(xiàn)到mysql第一次出現(xiàn)之間的所有行。
12. 一個(gè)驗(yàn)證passwd文件有效性的例子
$ cat /etc/passwd | awk -F: '\ NF != 7{\ printf("line %d,does not have 7 fields:%s\n",NR,$0)}\ $1 !~ /[A-Za-z0-9]/{printf("line %d,non alpha and numeric user id:%d: %s\n,NR,$0)}\ $2 == "*" {printf("line %d, no password: %s\n",NR,$0)}' |
cat把結(jié)果輸出給awk,awk把域之間的分隔符設(shè)為冒號(hào)。
如果域的數(shù)量(NF)不等于7,就執(zhí)行下面的程序。
printf打印字符串"line ?? does not have 7 fields",并顯示該條記錄。
如果第一個(gè)域沒(méi)有包含任何字母和數(shù)字,printf打印“no alpha and numeric user id" ,并顯示記錄數(shù)和記錄。
如果第二個(gè)域是一個(gè)星號(hào),就打印字符串“no passwd”,緊跟著顯示記錄數(shù)和記錄本身。
13. 幾個(gè)實(shí)例
打印所有以模式no或so開(kāi)頭的行。
$ awk '/^(no|so)/' test |
如果記錄以n或s開(kāi)頭,就打印這個(gè)記錄。
$ awk '/^[ns]/{print $1}' test |
如果第一個(gè)域以?xún)蓚€(gè)數(shù)字結(jié)束就打印這個(gè)記錄。
$ awk '$1 ~/[0-9][0-9]$/(print $1}' test |
如果第一個(gè)或等于100或者第二個(gè)域小于50,則打印該行。
$ awk '$1 == 100 || $2 < 50' test |
如果第一個(gè)域不等于10就打印該行。
$ awk '$1 != 10' test |
如果記錄包含正則表達(dá)式test,則第一個(gè)域加10并打印出來(lái)。
$ awk '/test/{print $1 + 10}' test |
如果第一個(gè)域大于5則打印問(wèn)號(hào)后面的表達(dá)式值,否則打印冒號(hào)后面的表達(dá)式值。
$ awk '{print ($1 > 5 ? "ok "$1: "error"$1)}' test |
打印以正則表達(dá)式root開(kāi)頭的記錄到以正則表達(dá)式mysql開(kāi)頭的記錄范圍內(nèi)的所有記錄。如果找到一個(gè)新的正則表達(dá)式root開(kāi)頭的記錄,則繼續(xù)打印直到下一個(gè)以正則表達(dá)式mysql開(kāi)頭的記錄為止,或到文件末尾。
$ awk '/^root/,/^mysql/' test |
14. awk編程
14.1. 變量
在awk中,變量不需要定義就可以直接使用,變量類(lèi)型可以是數(shù)字或字符串。
賦值格式:
Variable = expression,如$ awk '$1 ~/test/{count = $2 + $3; print count}' test |
$ awk -F: -f awkscript month=4 year=2004 test |
$ awk '{$2 = 100 + $1; print }' test |
$ awk '$1 == "root"{$1 ="test";print}' test |
$ awk -F: '{IGNORECASE=1; $1 == "MARY"{print NR,$1,$2,$NF}'test |
聯(lián)系客服