国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
awk簡(jiǎn)明教程

1. awk簡(jiǎn)介
2. awk命令格式和選項(xiàng)
    2.1. awk的語(yǔ)法有兩種形式
   
2.2. 命令選項(xiàng)

3. 模式和操作
    3.1. 模式
   
3.2. 操作

4. awk的環(huán)境變量
5. awk
運(yùn)算符
6. 記錄和域
    6.1. 記錄
   
6.2.
   
6.3. 域分隔符

7. gawk專(zhuān)用正則表達(dá)式元字符
8. POSIX
字符集
9. 匹配操作符(~)
10.
比較表達(dá)式
11.
范圍模板
12. 一個(gè)驗(yàn)證passwd
文件有效性的例子
13.
幾個(gè)實(shí)例
14. awk編程
     14.1. 變量
    
14.2. BEGIN模塊
     
14.3. END模塊
    
14.4. 重定向和管道
    
14.5. 條件語(yǔ)句
    
14.6. 循環(huán)
    
14.7. 數(shù)組
    
14.8. awk的內(nèi)建函數(shù)

15. How-to




正文


1. awk簡(jiǎn)介
      awk 是一種編程語(yǔ)言,用于在linux/unix下對(duì)文本和數(shù)據(jù)進(jìn)行處理。數(shù)據(jù)可以來(lái)自標(biāo)準(zhǔn)輸入、一個(gè)或多個(gè)文件,或其它命令的輸出。它支持用戶(hù)自定義函數(shù)和動(dòng)態(tài)正則表達(dá)式等先進(jìn)功能,是linux/unix下的一個(gè)強(qiáng)大編程工具。它在命令行中使用,但更多是作為腳本來(lái)使用。awk的處理文本和數(shù)據(jù)的方式是這樣的,它逐行掃描文件,從第一行到最后一行,尋找匹配的特定模式的行,并在這些行上進(jìn)行你想要的操作。如果沒(méi)有指定處理動(dòng)作,則把匹配的行顯示到標(biāo)準(zhǔn)輸出 (屏幕),如果沒(méi)有指定模式,則所有被操作所指定的行都被處理。awk分別代表其作者姓氏的第一個(gè)字母。因?yàn)樗淖髡呤侨齻€(gè)人,分別是Alfred Aho、Brian Kernighan、Peter Weinberger。gawk是awk的GNU版本,它提供了Bell實(shí)驗(yàn)室和GNU的一些擴(kuò)展。下面介紹的awk是以GUN的gawk為例的,在 linux系統(tǒng)中已把a(bǔ)wk鏈接到gawk,所以下面全部以awk進(jìn)行介紹。



2. awk命令格式和選項(xiàng)
      2.1. awk的語(yǔ)法有兩種形式

awk [options] 'script' var=value file(s)

awk [options] -f scriptfile var=value file(s)

      2.2. 命令選項(xiàng)

-F fs or --field-separator fs
指定輸入文件折分隔符,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)的警告。

-W posix
打開(kāi)兼容模式。但有以下限制,不識(shí)別:\x、函數(shù)關(guān)鍵字、func、換碼序列以及當(dāng)fs是一個(gè)空格時(shí),將新行作為一個(gè)域分隔符;操作符**和**=不能代替^和^=;fflush無(wú)效。

-W re-interval or --re-inerval
允許間隔正則表達(dá)式的使用,參考(grep中的Posix字符類(lèi)),如括號(hào)表達(dá)式[[:alpha:]]。

-W source program-text or --source program-text
使用program-text作為源代碼,可與-f命令混用。

-W version or --version
打印bug報(bào)告信息的版本。



3. 模式和操作
       awk腳本是由模式和操作組成的:
pattern {action} 如$ awk '/root/' test,或$ awk '$3 < 100' test

      兩者是可選的,如果沒(méi)有模式,則action應(yīng)用到全部記錄,如果沒(méi)有action,則輸出匹配全部記錄。默認(rèn)情況下,每一個(gè)輸入行都是一條記錄,但用戶(hù)可通過(guò)RS變量指定不同的分隔符進(jìn)行分隔。

     3.1. 模式
     模式可以是以下任意一個(gè):
     /正則表達(dá)式/:使用通配符的擴(kuò)展集。
     關(guān)系表達(dá)式:可以用下面運(yùn)算符表中的關(guān)系運(yùn)算符進(jìn)行操作,可以是字符串或數(shù)字的比較,如$2>%1選擇第二個(gè)字段比第一個(gè)字段長(zhǎng)的行。
     模式匹配表達(dá)式:用運(yùn)算符~(匹配)和~!(不匹配)。
     模式,模式:指定一個(gè)行的范圍。該語(yǔ)法不能包括BEGIN和END模式。
     BEGIN:讓用戶(hù)指定在第一條輸入記錄被處理之前所發(fā)生的動(dòng)作,通??稍谶@里設(shè)置全局變量。
     END:讓用戶(hù)在最后一條輸入記錄被讀取之后發(fā)生的動(dòng)作。
   3.2. 操作
    操作由一人或多個(gè)命令、函數(shù)、表達(dá)式組成,之間由換行符或分號(hào)隔開(kāi),并位于大括號(hào)內(nèi)。主要有四部份:
    變量或數(shù)組賦值
    輸出命令
    內(nèi)置函數(shù)
    控制流命令

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. 記錄和域
   6.1. 記錄
     awk把每一個(gè)以換行符結(jié)束的行稱(chēng)為一個(gè)記錄。
     記錄分隔符:默認(rèn)的輸入和輸出的分隔符都是回車(chē),保存在內(nèi)建變量ORS和RS中。
     $0變量:它指的是整條記錄。如$ awk '{print $0}' test將輸出test文件中的所有記錄。
     變量NR:一個(gè)計(jì)數(shù)器,每處理完一條記錄,NR的值就增加1。如$ awk '{print NR,$0}' test將輸出test文件中所有記錄,并在記錄前顯示記錄號(hào)。

  6.2.
     記錄中每個(gè)單詞稱(chēng)做“域”,默認(rèn)情況下以空格或tab分隔。awk可跟蹤域的個(gè)數(shù),并在內(nèi)建變量NF中保存該值。如$ awk '{print $1,$3}' test將打印test文件中第一和第三個(gè)以空格分開(kāi)的列(域)。
    6.3. 域分隔符
     內(nèi)建變量FS保存輸入域分隔符的值,默認(rèn)是空格或tab。我們可以通過(guò)-F命令行選項(xiàng)修改FS的值。如$ awk -F: '{print $1,$5}' test將打印以冒號(hào)為分隔符的第一,第五列的內(nèi)容。
     可以同時(shí)使用多個(gè)域分隔符,這時(shí)應(yīng)該把分隔符寫(xiě)成放到方括號(hào)中,如$awk -F'[:\t]' '{print $1,$3}' test,表示以空格、冒號(hào)和tab作為分隔符。
     輸出域的分隔符默認(rèn)是一個(gè)空格,保存在OFS中。如$ awk -F: '{print $1,$5}' test,$1和$5間的逗號(hào)就是OFS的值。
7. gawk專(zhuān)用正則表達(dá)式元字符
     一般通用的元字符集就不講了,可參考我的Sed和Grep學(xué)習(xí)筆記。以下幾個(gè)是gawk專(zhuān)用的,不適合unix版本的awk。
\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先掃描第一個(gè)域,一旦test匹配,就把第二個(gè)域的值加上第三個(gè)域的值,并把結(jié)果賦值給變量count,最后打印出來(lái)。
      awk可以在命令行中給變量賦值,然后將這個(gè)變量傳輸給awk腳本。如
$ awk -F: -f awkscript month=4 year=2004 test
上式的month和year都是自定義變量,分別被賦值為4和2004。在awk腳本中,這些變量使用起來(lái)就象是在腳本中建立的一樣。注意,如果參數(shù)前面出現(xiàn)test,那么在BEGIN語(yǔ)句中的變量就不能被使用。
      域變量也可被賦值和修改,如

$ awk '{$2 = 100 + $1; print }' test
上式表示,如果第二個(gè)域不存在,awk將計(jì)算表達(dá)式100加$1的值,并將其賦值給$2,如果第二個(gè)域存在,則用表達(dá)式的值覆蓋$2原來(lái)的值。再例如:
$ awk '$1 == "root"{$1 ="test";print}' test
如果第一個(gè)域的值是“root”,則把它賦值為“test”,注意,字符串一定要用雙引號(hào)。
      內(nèi)建變量的使用。變量列表在前面已列出,現(xiàn)在舉個(gè)例子說(shuō)明一下。

$ awk -F: '{IGNORECASE=1; $1 == "MARY"{print NR,$1,$2,$NF}'test
把IGNORECASE設(shè)為1代表忽略大小寫(xiě),打印第一個(gè)域是mary的記錄數(shù)、第一個(gè)域、第二個(gè)域和最后一個(gè)域。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
10個(gè)超級(jí)棒的Awk命令
windws下面使用gawk的方法
Linux Shell 編程常用技巧、實(shí)例(四)
Linux Shell三劍客之a(chǎn)wk,功能強(qiáng)大的文本處理工具
awk經(jīng)典,有這一篇就夠了
【awk】awk語(yǔ)法(小結(jié))
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服