日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

通用線程:Awk 實(shí)例( 二 )


以這種方式調(diào)用 print 時(shí),它將連接 $1、" " 和 $3,創(chuàng)建可讀的輸出 。當(dāng)然,如果需要的話,我們還可以插入一些文本標(biāo)簽:
$ awk -F":" "{ print "username: " $1 "ttuid:" $3" }" /etc/passwd
這將產(chǎn)生以下輸出:
username: halt uid:7username: operator uid:11username: root uid:0username: shutdown uid:6username: sync uid:5username: bin uid:1....etc.
外部腳本
將腳本作為命令行自變量傳遞給 awk 對于小的單行程序來說是非常簡單的,而對于多行程序,它就比較復(fù)雜 。您肯定想要在外部文件中撰寫腳本 。然后可以向 awk 傳遞 -f 選項(xiàng),以向它提供此腳本文件:
$ awk -f myscript.awk myfile.in
將腳本放入文本文件還可以讓您使用附加 awk 功能 。例如,這個(gè)多行腳本與前面的單行腳本的作用相同,它們都打印出 /etc/passwd 中每一行的第一個(gè)字段:
BEGIN { FS=":"}{ print $1 }
這兩個(gè)方法的差別在于如何設(shè)置字段分隔符 。在這個(gè)腳本中,字段分隔符在代碼自身中指定(通過設(shè)置 FS 變量),而在前一個(gè)示例中,通過在命令行上向 awk 傳遞 -F":" 選項(xiàng)來設(shè)置 FS 。通常,最好在腳本自身中設(shè)置字段分隔符,只是因?yàn)檫@表示您可以少輸入一個(gè)命令行自變量 。我們將在本文的后面詳細(xì)討論 FS 變量 。
BEGIN 和 END 塊
通常,對于每個(gè)輸入行,awk 都會執(zhí)行每個(gè)腳本代碼塊一次 。然而,在許多編程情況中,可能需要在 awk 開始處理輸入文件中的文本之前執(zhí)行初始化代碼 。對于這種情況,awk 允許您定義一個(gè) BEGIN 塊 。我們在前一個(gè)示例中使用了 BEGIN 塊 。因?yàn)?awk 在開始處理輸入文件之前會執(zhí)行 BEGIN 塊,因此它是初始化 FS(字段分隔符)變量、打印頁眉或初始化其它在程序中以后會引用的全局變量的極佳位置 。
awk 還提供了另一個(gè)特殊塊,叫作 END 塊 。awk 在處理了輸入文件中的所有行之后執(zhí)行這個(gè)塊 。通常,END 塊用于執(zhí)行最終計(jì)算或打印應(yīng)該出現(xiàn)在輸出流結(jié)尾的摘要信息 。
規(guī)則表達(dá)式和塊
awk 允許使用規(guī)則表達(dá)式,根據(jù)規(guī)則表達(dá)式是否匹配當(dāng)前行來選擇執(zhí)行獨(dú)立代碼塊 。以下示例腳本只輸出包含字符序列 foo 的那些行:
/foo/ { print }
當(dāng)然,可以使用更復(fù)雜的規(guī)則表達(dá)式 。以下腳本將只打印包含浮點(diǎn)數(shù)的行:
/[0-9] .[0-9]*/ { print }
表達(dá)式和塊
還有許多其它方法可以選擇執(zhí)行代碼塊 。我們可以將任意一種布爾表達(dá)式放在一個(gè)代碼塊之前,以控制何時(shí)執(zhí)行某特定塊 。僅當(dāng)對前面的布爾表達(dá)式求值為真時(shí),awk 才執(zhí)行代碼塊 。以下示例腳本輸出將輸出其第一個(gè)字段等于 fred 的所有行中的第三個(gè)字段 。如果當(dāng)前行的第一個(gè)字段不等于 fred,awk 將繼續(xù)處理文件而不對當(dāng)前行執(zhí)行 print 語句:
$1 == "fred" { print $3 }
awk 提供了完整的比較運(yùn)算符集合,包括 "=="、"<"、">"、"<="、">=" 和 "!=" 。另外,awk 還提供了 "~" 和 "!~" 運(yùn)算符,它們分別表示“匹配”和“不匹配” 。它們的用法是在運(yùn)算符左邊指定變量,在右邊指定規(guī)則表達(dá)式 。如果某一行的第五個(gè)字段包含字符序列 root,那么以下示例將只打印這一行中的第三個(gè)字段:
$5 ~ /root/ { print $3 }
條件語句
awk 還提供了非常好的類似于 C 語言的 if 語句 。如果您愿意,可以使用 if 語句重寫前一個(gè)腳本:
{ if ( $5 ~ /root/ ) { print $3 }}
這兩個(gè)腳本的功能完全一樣 。第一個(gè)示例中,布爾表達(dá)式放在代碼塊外面 。而在第二個(gè)示例中,將對每一個(gè)輸入行執(zhí)行代碼塊,而且我們使用 if 語句來選擇執(zhí)行 print 命令 。這兩個(gè)方法都可以使用,可以選擇最適合腳本其它部分的一種方法 。
以下是更復(fù)雜的 awk if 語句示例 。可以看到,盡管使用了復(fù)雜、嵌套的條件語句,if 語句看上去仍與相應(yīng)的 C 語言 if 語句一樣:

推薦閱讀