• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            專職C++

            不能停止的腳步

              C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
              163 Posts :: 7 Stories :: 135 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(28)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            原文:http://savs.hcc.edu.tw/~chuavv/bash/Bash-Beginners-Guide-SimplifiedChinese/index.html 
            目錄

            6.1. gawk上路

            6.1.1. 什么是gawk?

            6.1.2. Gawk命令

            6.2. 打印程序

            6.2.1. 打印選擇的域

            6.2.2. 格式化域

            6.2.3. print命令和正則表達(dá)式

            6.2.4. 特殊的patterns

            6.2.5. Gawk腳本

            6.3. Gawk變量

            6.3.1. 輸入域的分隔符

            6.3.2. 輸出分隔符

            6.3.3. 記錄的數(shù)量

            6.3.4. 用戶定義的變量

            6.3.5. 更多例子

            6.3.6. printf程序

            6.4. 總結(jié)

            6.5. 練習(xí)

            摘要

            本章我們會(huì)討論:

            • 什么是 gawk
            • 在命令行中使用 gawk 命令
            • 怎么使用 gawk 來(lái)格式化文本
            • gawk 怎么使用則正則表達(dá)式
            • 腳本中的 gawk
            • gawk 和變量

            把它變得更有趣味

            就像sed一樣,整本書(shū)寫(xiě)了多個(gè)版本的awk。這個(gè)介紹遠(yuǎn)還不夠完整,且只是為了能夠理解在后面章節(jié)中的例子。要得到更多的信息,最好是從 GNU awk 的隨附文檔開(kāi)始:“GAWK: Effective AWK Programming: A User's Guide for GNU Awk”.

            6.1. gawk上路

            6.1.1. 什么是gawk?

            Gawk 是通常在UNIX系統(tǒng)下使用的另外一個(gè)流行的流編輯器 awk 的GNU版本。盡管 awk 程序常常只是一個(gè) gawk 的連接,但是我們還是稱作它為 awk

            awk 的最基本的作用是搜索含有1個(gè)或者多個(gè)模板的文件中的行或者其他文本塊。當(dāng)一行符合搜索的patterns,在該行就會(huì)實(shí)現(xiàn)指定的動(dòng)作。

            在 awk 中的程序和許多其他語(yǔ)言中的程序是不一樣的,因?yàn)?nbsp;awk 程序是 “數(shù)據(jù)驅(qū)動(dòng)的” :你先描述你想處理的數(shù)據(jù),然后當(dāng)找到它們的時(shí)候怎么處理。許多其他的語(yǔ)言是“過(guò)程的”。你需要具體的描述程序該采取的措施。當(dāng)使用過(guò)程化的語(yǔ)言時(shí),通常更難清楚地描述你需要處理的數(shù)據(jù)。正因?yàn)槿绱耍?nbsp;awk 程序經(jīng)常能清爽容易地讀寫(xiě)。

            6.1.2. Gawk命令

            當(dāng)你運(yùn)行 awk 的時(shí)候,你指定一個(gè) awk 程序 來(lái)通知 awk 該如何做。程序由一系列 規(guī)則 組成。(也可能包含函數(shù)定義,循環(huán),條件和其他程序結(jié)構(gòu),高級(jí)特性等一系列我們已經(jīng)遺忘的東西。)每個(gè)規(guī)則指定了搜索的模板和在搜索到一個(gè)模板后執(zhí)行的動(dòng)作。

            有幾種運(yùn)行 awk 的方法。如果程序很短,最方便的是在命令行運(yùn)行它:

            awk PROGRAM inputfile(s)

            在已經(jīng)完成的多個(gè)改變,通常在多個(gè)文件,很方便把 awk 命令放到腳本當(dāng)中,讀起來(lái)像這樣:

            awk -f PROGRAM-FILE inputfile(s)

             

            源文檔 <http://savs.hcc.edu.tw/~chuavv/bash/Bash-Beginners-Guide-SimplifiedChinese/ch06.html>

            6.2. 打印程序

            6.2.1. 打印選擇的域

            awk 中的 print 命令把輸入文件中選擇的數(shù)據(jù)輸出。

            當(dāng) awk 讀取文件的一行,根據(jù)指定的 輸入域分隔符 把行分開(kāi), FS,awk 的一個(gè)環(huán)境變量(見(jiàn) 第 6.3.2 節(jié) “輸出分隔符”)。它被預(yù)先定義為一個(gè)或者多個(gè)空格或者制表符。

            變量 $1, $2, $3, ..., $N 把輸入行的第一第二第三直到最后一個(gè)域保存起來(lái)。變量 $0 把整行的值保存起來(lái)。在下面的圖片描述中,我們看到 df 命令輸出有6欄。

            圖 6.1. awk中的塊

            在 ls -l 的輸出,有9欄。 print 語(yǔ)句像這樣使用這些域:

            kelly@octarine ~/test> ls -l | awk '{ print $5 $9 }'
            160orig
            121script.sed
            120temp_file
            126test
            120twolines
            441txt2html.sh

            kelly@octarine ~/test>

            這個(gè)命令把包含文件大小的第五欄和包含文件名的最后一欄打印出來(lái)。除非你使用正式的方法來(lái)用一個(gè)逗號(hào)來(lái)分割你想打印的列,否則輸出并不十分適合閱讀。這樣的情況下,默認(rèn)的輸出分割字符,通常是一個(gè)空格,將被放入每個(gè)輸出域。

            6.2.2. 格式化域

            沒(méi)有格式化,只使用輸出分隔符的話看上去比較破,插入幾個(gè)制表符和指示輸出的標(biāo)記會(huì)使它變得漂亮很多:

            kelly@octarine ~/test> ls -ldh * | grep -v total | \
            awk
            '{ print "Size is " $5 " bytes for " $9 }'
            Size is 160 bytes for orig
            Size is 121 bytes for script.sed
            Size is 120 bytes for temp_file
            Size is 126 bytes for test
            Size is 120 bytes for twolines
            Size is 441 bytes for txt2html.sh

            kelly@octarine ~/test>

            注意反斜杠的用法,讓shell不把它翻譯成分隔命令而使其在下一行繼續(xù)很長(zhǎng)的輸入。雖然命令行的輸入實(shí)際上是沒(méi)有長(zhǎng)度限制的,但是你的顯示器不是,打印的紙當(dāng)然也不是。使用反斜杠也允許拷貝和粘貼以上行到一個(gè)終端窗口。

            ls 的 -h 選項(xiàng)用來(lái)支持把大文件的字節(jié)數(shù)轉(zhuǎn)換成更容易讀的格式。當(dāng)把目錄作為參數(shù)的時(shí)候長(zhǎng)列表的輸出顯示目錄中快的總數(shù)。這行對(duì)我們并沒(méi)有什么用處,所以我們加上一個(gè)*。同樣的原因我們同樣加上 -d 選項(xiàng),萬(wàn)一*對(duì)一個(gè)目錄展開(kāi)。

            在這個(gè)例子中的反斜杠提示了一行的延長(zhǎng)。見(jiàn) 第 3.3.2 節(jié) “轉(zhuǎn)義字符”

            甚至在反序中你也能取出任何欄的的數(shù)字。下面的例子證明了最危險(xiǎn)的區(qū)分。

            kelly@octarine ~> df -h | sort -rnk 5 | head -3 | \
            awk
            '{ print "Partition " $6 "\t: " $5 " full!" }'
            Partition /var  : 86% full!
            Partition /usr  : 85% full!
            Partition /home : 70% full!

            kelly@octarine ~>

            下表給出了特殊格式化字符的總攬:

            表 6.1. gawk的格式化字符

            轉(zhuǎn)義字符

            含義

            \a

            Bell character

            \n

            Newline character

            \t

            Tab

            引用,$和其他元字符應(yīng)該使用反斜杠來(lái)進(jìn)行轉(zhuǎn)義。

            6.2.3. print命令和正則表達(dá)式

            用斜杠把正則表達(dá)式包含起來(lái)可以當(dāng)作一個(gè)pattern。然后正則表達(dá)式測(cè)試整個(gè)文本的每條記錄。語(yǔ)法如下:

            awk 'EXPRESSION { PROGRAM }' file(s)

            下面的例子現(xiàn)實(shí)了只有本地磁盤(pán)設(shè)備的信息,網(wǎng)絡(luò)文件系統(tǒng)沒(méi)有顯示:

            kelly is in ~> df -h | awk '/dev\/hd/ { print $6 "\t: " $5 }'
            /       : 46%
            /boot   : 10%
            /opt    : 84%
            /usr    : 97%
            /var    : 73%
            /.vol1  : 8%

            kelly is in ~>

            斜杠也需要轉(zhuǎn)義,因?yàn)閷?duì)于 awk 它們有著特殊的含義。

            下面的另外一個(gè)例子是我們?cè)?nbsp;/etc 目錄搜索以 “.conf” 結(jié)尾和 “a” 或者 “x” 開(kāi)頭的文件,使用擴(kuò)展的正則表達(dá)式:

            kelly is in /etc> ls -l | awk '/\<(a|x).*\.conf$/ { print $9 }'
            amd.conf
            antivir.conf
            xcdroast.conf
            xinetd.conf

            kelly is in /etc>

            這個(gè)例子說(shuō)明了在正則表達(dá)式中.的特殊意義。第一個(gè)表明了我們想要搜索在第一個(gè)搜索字符串之后的任何字符,第二個(gè)因?yàn)槭且檎易址囊徊糠炙员晦D(zhuǎn)義了(文件名的結(jié)束)。

            6.2.4. 特殊的patterns

            為了在輸出之前加上注釋,使用BEGIN語(yǔ)句:

            kelly is in /etc> ls -l | \
            awk
            'BEGIN { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }'
            Files found:
            amd.conf
            antivir.conf
            xcdroast.conf
            xinetd.conf

            kelly is in /etc>

            加上 END 語(yǔ)句能插入文本在整個(gè)輸入被處理之后:

            kelly is in /etc> ls -l | \
            awk
            '/\<[a|x].*\.conf$/ { print $9 } END { print \
            "Can I do anything else for you, mistress?" }'

            amd.conf
            antivir.conf
            xcdroast.conf
            xinetd.conf
            Can I do anything else for you, mistress?

            kelly is in /etc>

            6.2.5. Gawk腳本

            由于往往命令都有點(diǎn)長(zhǎng),你可能想把他們放到腳本中,來(lái)重用它。一個(gè) awk 腳本包含定義pattern和動(dòng)作的awk語(yǔ)句。

            作為一個(gè)說(shuō)明,我們將建立一個(gè)報(bào)告來(lái)顯示占用率最高的分區(qū),參見(jiàn) 第 6.2.2 節(jié) “格式化域”

            kelly is in ~> cat diskrep.awk
            BEGIN { print "*** WARNING WARNING WARNING ***" }
            /\<[8|9][0-9]%/ { print "Partition " $6 "\t: " $5 " full!" }
            END { print "*** Give money for new disks URGENTLY! ***" }

            kelly is in ~> df -h | awk -f diskrep.awk
            *** WARNING WARNING WARNING ***
            Partition /usr  : 97% full!
            *** Give money for new disks URGENTLY! ***

            kelly is in ~>

            awk 先打印一個(gè)開(kāi)始信息,然后格式化所有包含一個(gè)8或者9開(kāi)頭的詞的行,然后后接一個(gè)數(shù)字和百分符號(hào),然后加入結(jié)束信息。

            語(yǔ)法高亮

            Awk是一個(gè)編程語(yǔ)言。他的語(yǔ)法能被大多數(shù)能對(duì)其他語(yǔ)言比如c,bash,HTML進(jìn)行語(yǔ)法高亮編輯器所識(shí)別。

             

            源文檔 <http://savs.hcc.edu.tw/~chuavv/bash/Bash-Beginners-Guide-SimplifiedChinese/ch06s02.html>

             

            6.3. Gawk變量

            既然 awk 處理輸入文件,他使用幾個(gè)變量。一些是可以編輯的,一些是只讀的。

            6.3.1. 輸入域的分隔符

            域分隔符,既不是一個(gè)單獨(dú)的字符也不是一個(gè)普通的表達(dá)式,是控制 awk 把一個(gè)輸入分割成幾個(gè)域。輸入記錄按分割定義進(jìn)行字符順序掃描;域就是在相符的那些文字中間的那部分。

            域分隔符代表內(nèi)建的變量 FS,注意POSIX標(biāo)準(zhǔn)的shell使用的變量 IFS 和他是有一些區(qū)別的。

            域分隔符變量的值可以在 awk 程序中用賦值操作符 = 來(lái)改變。通常最好的執(zhí)行時(shí)間是一開(kāi)始也就是還沒(méi)有處理任何輸入的時(shí)候,因此第一個(gè)記錄就被隨合適的分隔符一起讀取。要這么做,清使用特殊的 BEGIN pattern。

            以下的例子,我們編制了一條命令來(lái)顯示系統(tǒng)里的所有用戶及其描述:

            kelly is in ~> awk 'BEGIN { FS=":" } { print $1 "\t" $5 }' /etc/passwd
            --output omitted--
            kelly        Kelly Smith
            franky        Franky B.
            eddy        Eddy White
            willy        William Black
            cathy        Catherine the Great
            sandy        Sandy Li Wong

            kelly is in ~>

            在一個(gè) awk 腳本中,它看起來(lái)像這樣:

            kelly is in ~> cat printnames.awk
            BEGIN { FS=":" }
            { print $1 "\t" $5 }

            kelly is in ~> awk -f printnames.awk /etc/passwd
            --output omitted--

            小心地選擇輸入分隔域來(lái)防止出現(xiàn)問(wèn)題。一個(gè)例子來(lái)說(shuō)明這個(gè):說(shuō)你需要輸入想這樣的行的形式:

            “Sandy L. Wong, 64 Zoo St., Antwerp, 2000X”

            你這樣寫(xiě)了一個(gè)打印出記錄中人的名字的命令行或者是腳本:

            awk 'BEGIN { FS="," } { print $1, $2, $3 }' inputfile

            但是可能一個(gè)人有PhD,而且可能寫(xiě)成這樣:

            “Sandy L. Wong, PhD, 64 Zoo St., Antwerp, 2000X”

            你的 awk 會(huì)給出錯(cuò)誤的輸出。需要的話,使用額外的一個(gè) awk 或者 sed 來(lái)統(tǒng)一數(shù)據(jù)輸出的格式。

            默認(rèn)的輸入分隔符是一個(gè)或多個(gè)空格和制表符。

            6.3.2. 輸出分隔符

            6.3.2.1. 輸出域分隔符

            在輸出中域通常被空格分隔。當(dāng)你對(duì) print 命令使用正確的語(yǔ)法且字段用逗號(hào)分隔時(shí),這將很明顯的:

            kelly@octarine ~/test> cat test
            record1         data1
            record2         data2

            kelly@octarine ~/test> awk '{ print $1 $2}' test
            record1data1
            record2data2

            kelly@octarine ~/test> awk '{ print $1, $2}' test
            record1 data1
            record2 data2

            kelly@octarine ~/test>

            如果你不輸入逗號(hào), print 將把輸出的項(xiàng)目全部當(dāng)成一個(gè)字段,因此省略默認(rèn)輸出 分隔符, OFS的使用。

            在攝制了這個(gè)內(nèi)建變量的值之后任何字符串可以被用作一個(gè)輸出域。

            6.3.2.2. 輸出記錄分隔符

            整個(gè) print 語(yǔ)句的輸出叫做輸出記錄。每個(gè)在輸出記錄里的print命令的結(jié)果,輸出一個(gè)叫做 輸出記錄分隔符 ORS的字符串。這個(gè)變量的默認(rèn)值是 “\n”,一個(gè)換行符。因此,每個(gè) print 語(yǔ)句生成一個(gè)單獨(dú)的行。

            要改變輸出域和記錄的,只要給 OFS 和 ORS 賦新的值:

            kelly@octarine ~/test> awk 'BEGIN { OFS=";" ; ORS="\n-->\n" } \
            { print $1,$2}'
            test
            record1;data1
            -->
            record2;data2
            -->

            kelly@octarine ~/test>

            如果 ORS 的值不包含換行,那么程序中的輸出就會(huì)輸出成一個(gè)單獨(dú)行。

            6.3.3. 記錄的數(shù)量

            內(nèi)建的 NR 包含了處理過(guò)的記錄的數(shù)量。在讀入一個(gè)新的輸入行之后他會(huì)自行增加一次。你可以用它來(lái)計(jì)算記錄的總數(shù),或者在每個(gè)輸出記錄中:

            kelly@octarine ~/test> cat processed.awk
            BEGIN { OFS="-" ; ORS="\n--> done\n" }
            { print "Record number " NR ":\t" $1,$2 }
            END { print "Number of records processed: " NR }

            kelly@octarine ~/test> awk -f processed.awk test
            Record number 1:        record1-data1
            --> done
            Record number 2:        record2-data2
            --> done
            Number of records processed: 2
            --> done

            kelly@octarine ~/test>

            6.3.4. 用戶定義的變量

            除了內(nèi)建的變量之外,你也可以定義自己的變量。當(dāng) awk 碰到一個(gè)不存在的變量(沒(méi)有事先定義的)的引用時(shí),這個(gè)變量就被創(chuàng)建并且使用一個(gè)空字符串進(jìn)行賦值。對(duì)于后來(lái)所有的引用,就是該變量最后被賦予的那個(gè)值。變量可以是一個(gè)字符串或者一個(gè)數(shù)字。輸入域的內(nèi)容也可以被賦予變量。

            值可以直接用 = 來(lái)賦值,或者你可以使用現(xiàn)有變量的值和其他操作符組合:

            kelly@octarine ~> cat revenues
            20021009        20021013        consultancy     BigComp         2500
            20021015        20021020        training        EduComp         2000
            20021112        20021123        appdev          SmartComp       10000
            20021204        20021215        training        EduComp         5000

            kelly@octarine ~> cat total.awk
            { total=total + $5 }
            { print "Send bill for " $5 " dollar to " $4 }
            END { print "---------------------------------\nTotal revenue: " total }

            kelly@octarine ~> awk -f total.awk test
            Send bill for 2500 dollar to BigComp
            Send bill for 2000 dollar to EduComp
            Send bill for 10000 dollar to SmartComp
            Send bill for 5000 dollar to EduComp
            ---------------------------------
            Total revenue: 19500

            kelly@octarine ~>

            類(lèi)似于C的簡(jiǎn)寫(xiě) VAR+= value 也是可以接受的。

            6.3.5. 更多例子

            當(dāng)我們使用 awk 腳本時(shí), 第 5.3.2 節(jié) “寫(xiě)輸出文件” 的例子會(huì)變得更加容易:

            kelly@octarine ~/html> cat make-html-from-text.awk
            BEGIN { print "<html>\n<head><title>Awk-generated HTML</title></head>\n<body bgcolor=\"#ffffff\">\n<pre>" }
            { print $0 }
            END { print "</pre>\n</body>\n</html>" }

            而且當(dāng)用 awk 來(lái)替代 sed 后,命令也變得更加直截了當(dāng):

            kelly@octarine ~/html> awk -f make-html-from-text.awk testfile > file.html

            在你系統(tǒng)上的awk例子。

            我們?cè)俅位氐桨阆到y(tǒng)啟動(dòng)腳本的目錄。輸入一個(gè)和以下相似的命令來(lái)查看更多 awk 命令的使用方法:

            grep awk /etc/init.d/*

            6.3.6. printf程序

            為了更精確的控制 print 提供的正常輸出格式,可以使用 printf。 printf命令可以用來(lái)指明每個(gè)項(xiàng)目使用的域的寬度,同時(shí)也有用于數(shù)字的多種格式選擇。這一切只要增加一個(gè)字符串,叫做格式字符串,控制怎樣和那里來(lái)打印那些項(xiàng)目。

            語(yǔ)法也和C語(yǔ)言的 printf 語(yǔ)句相似;請(qǐng)察看你的C介紹手冊(cè)。 gawk 信息頁(yè)面包含完整的解釋。

             

            源文檔 <http://savs.hcc.edu.tw/~chuavv/bash/Bash-Beginners-Guide-SimplifiedChinese/ch06s03.html>

             

            6.4. 總結(jié)

            gawk 工具解釋特殊目的的編程語(yǔ)言,處理簡(jiǎn)單的數(shù)據(jù)重新格式化的工作,只需要幾行代碼。他是通常UNIX awk 命令的免費(fèi)版本。

            這個(gè)工具從輸入數(shù)據(jù)讀取行且能夠方便的識(shí)別。 print 是最普通的來(lái)過(guò)濾和格式化定義的域的程序。

            閑置的變量可以直接聲明也允許在處理輸入流的同時(shí)進(jìn)行簡(jiǎn)單的計(jì)算求和,統(tǒng)計(jì)和其他運(yùn)算。變量和命令可以放到 awk 腳本來(lái)進(jìn)行后臺(tái)處理。

             

            源文檔 <http://savs.hcc.edu.tw/~chuavv/bash/Bash-Beginners-Guide-SimplifiedChinese/ch06s04.html

            posted on 2012-03-02 13:59 冬瓜 閱讀(573) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 轉(zhuǎn)貼
            69国产成人综合久久精品| 久久婷婷色香五月综合激情| 精品午夜久久福利大片| 久久99国产精一区二区三区| 久久国产精品久久| 久久综合偷偷噜噜噜色| 热re99久久精品国99热| 精品久久久久久久中文字幕| 亚洲中文字幕无码久久精品1| 久久精品国产亚洲av影院| 久久久精品无码专区不卡| 日韩久久久久久中文人妻| 久久se精品一区精品二区国产| 久久狠狠爱亚洲综合影院| 久久99精品国产麻豆不卡| 国产精品天天影视久久综合网| 一日本道伊人久久综合影| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久本道伊人久久| 久久人与动人物a级毛片| 久久精品成人免费观看97| 久久久精品一区二区三区| 久久精品国产精品亚洲精品| 久久青青草原精品国产软件| 九九久久99综合一区二区| 亚洲日韩中文无码久久| 久久99精品国产麻豆宅宅| 久久综合视频网站| 色婷婷久久综合中文久久一本| 99久久精品免费| 精品一久久香蕉国产线看播放 | 久久香蕉国产线看观看99| 99久久国产综合精品麻豆| 久久国产免费观看精品3| 久久人人爽人人爽人人AV东京热| 香蕉久久夜色精品升级完成| 国产精品久久久久久久人人看| 狠狠色丁香久久婷婷综合图片| 国产精品成人久久久| 99精品久久久久久久婷婷| 亚洲日本va中文字幕久久|