• <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>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            awk內(nèi)置字符串函數(shù)詳解

            Posted on 2010-03-28 17:14 Prayer 閱讀(537) 評論(0)  編輯 收藏 引用 所屬分類: Shell
            awk提供了許多強(qiáng)大的字符串函數(shù),見下表:
            awk內(nèi)置字符串函數(shù)
            gsub(r,s) 在整個(gè)$0中用s替代r
            gsub(r,s,t) 在整個(gè)t中用s替代r
            index(s,t)
            返回s中字符串t的第一位置
            length(s)
            返回s長度
            match(s,r)
            測試s是否包含匹配r的字符串
            split(s,a,fs) 在fs上將s分成序列a
            sprint(fmt,exp) 返回經(jīng)fmt格式化后的exp
            sub(r,s)
            用$0中最左邊最長的子串代替s
            substr(s,p) 返回字符串s中從p開始的后綴部分
            substr(s,p,n)
            返回字符串s中從p開始長度為n的后綴部分
            詳細(xì)說明一下各個(gè)函數(shù)的使用方法。

            gsub函數(shù)有點(diǎn)類似于sed查找和替換。它允許替換一個(gè)字符串或字符為另一個(gè)字符串或字符,并以正則表達(dá)式的形式執(zhí)行。第一個(gè)函數(shù)作用于記錄$0,第二個(gè)gsub函數(shù)允許指定目標(biāo),然而,如果未指定目標(biāo),缺省為$0。
            index(s,t)函數(shù)返回目標(biāo)字符串s中查詢字符串t的首位置。length函數(shù)返回字符串s字符
            長度。match函數(shù)測試字符串s是否包含一個(gè)正則表達(dá)式r定義的匹配。split使用域分隔符fs將
            字符串s劃分為指定序列a。sprint函數(shù)類似于printf函數(shù)(以后涉及),返回基本輸出格式fmt的
            結(jié)果字符串exp。sub(r,s)函數(shù)將用s替代$0中最左邊最長的子串,該子串被(r)匹配。
            sub(s,p)返回字符串s在位置p后的后綴。substr(s,p,n)同上,并指定子串長度為n。
            現(xiàn)在看一看awk中這些字符串函數(shù)的功能。

            1.gsub
            要在整個(gè)記錄中替換一個(gè)字符串為另一個(gè),使用正則表達(dá)式格式,/目標(biāo)模式/,替換模式
            /。例如改變學(xué)生序號4842到4899:

            $ awk 'gsub('4842/, 4899) {print $0}' grade.txt
            J.Troll 07/99 4899 Brown-3 12 26 26

            2.index
            查詢字符串s中t出現(xiàn)的第一位置。必須用雙引號將字符串括起來。例如返回目標(biāo)字符串
            Bunny中ny出現(xiàn)的第一位置,即字符個(gè)數(shù)。

            $ awk 'BEGIN {print index("Bunny", "ny")} grade.txt
            4

            3.length
            返回所需字符串長度,例如檢驗(yàn)字符串J.Troll返回名字及其長度,即人名構(gòu)成的字符個(gè)
            數(shù)。

            $ awk '$1=="J.Troll" {print length($1) " "$1}' grade.txt
            7 J.Troll

            還有一種方法,這里字符串加雙引號。

            $ awk 'BEGIN {print length("A FEW GOOD MEN")}'
            14

            4.match
            match測試目標(biāo)字符串是否包含查找字符的一部分。可以對查找部分使用正則表達(dá)式,返
            回值為成功出現(xiàn)的字符排列數(shù)。如果未找到,返回0,第一個(gè)例子在ANCD中查找d。因其不
            存在,所以返回0。第二個(gè)例子在ANCD中查找D。因其存在,所以返回ANCD中D出現(xiàn)的首位
            置字符數(shù)。第三個(gè)例子在學(xué)生J.Lulu中查找u。

            $ awk '{BEGIN {print match("ANCD", /d/)}'
            0
            $ awk '{BEGIN {print match("ANCD", /C/)}'
            3
            $ awk '$1=="J.Lulu" {print match($1, "u")} grade.txt
            4

            5.split
            使用split返回字符串?dāng)?shù)組元素個(gè)數(shù)。工作方式如下:如果有一字符串,包含一指定分隔
            符-,例如AD2-KP9-JU2-LP-1,將之劃分成一個(gè)數(shù)組。使用split,指定分隔符及數(shù)組名。此
            例中,命令格式為("AD2-KP9-JU2-LP-1",parts_array,"-"),split然后返回?cái)?shù)組下標(biāo)數(shù),這
            里結(jié)果為4。
            還有一個(gè)例子使用不同的分隔符。

            $ awk '{BEGIN {print split("123#456#678", myarray, "#")}'
            3

            這個(gè)例子中,split返回?cái)?shù)組myarray的下標(biāo)數(shù)。數(shù)組myarray取值如下:

            Myarray[1]="123"
            Myarray[2]="456"
            Myarray[3]="789"

            6.sub
            使用sub發(fā)現(xiàn)并替換模式的第一次出現(xiàn)位置。字符串STR包含‘popedpopopill’,執(zhí)行下
            列sub命令sub(/op/,"op",STR)。模式op第一次出現(xiàn)時(shí),進(jìn)行替換操作,返回結(jié)果如下:
            ‘pOPedpopepill’。
            假如grade.txt文件中,學(xué)生J.Troll的記錄有兩個(gè)值一樣,“目前級別分”與“最高級別分”。只
            改變第一個(gè)為29,第二個(gè)仍為24不動,操作命令為sub(/26/,"29",$0),只替換第一個(gè)出現(xiàn)
            24的位置。

            $ awk '$1=="J.Troll" sub(/26/, "29", $0)' grade.txt
            L.Troll 07/99 4842 Brown-3 12 29 26
            L.Transley 05/99 4712 Brown-2 12 30 28

            7.substr
            substr是一個(gè)很有用的函數(shù)。它按照起始位置及長度返回字符串的一部分。例子如下:

            $ awk '$1=="L.Transley" {print substr($1, 1,5)}' grade.txt
            L.Tan
            上面例子中,指定在域1的第一個(gè)字符開始,返回其前面5個(gè)字符。
            如果給定長度值遠(yuǎn)大于字符串長度, awk將從起始位置返回所有字符,要抽取L.Tansley的姓,只需從第3個(gè)字符開始返回長度為7。可以輸入長度99,awk返回結(jié)果相同。

            $ awk '{$1=="L.Transley" {print substr($1, 3,99)}' grade.txt
            Transley

            substr的另一種形式是返回字符串后綴或指定位置后面字符。這里需要給出指定字符串及其返回字串的起始位置。例如,從文本文件中抽取姓氏,需操作域1,并從第三個(gè)字符開始:

            $ awk '{print substr($1, 3)}' grade.txt
            Troll
            Transley

            還有一個(gè)例子,在BEGIN部分定義字符串,在END部分返回從第t個(gè)字符開始抽取的子串。

            $ awk '{BEGIN STR="A FEW GOOD MEN"} END {print substr(STR,7)) grade.txt
            GOOD MEN

            8.從shell中向awk傳入字符串
            awk腳本大多只有一行,其中很少是字符串表示的,這一點(diǎn)通過將變量傳入awk命令行會變得很容易。現(xiàn)就其基本原理講述一些例子。
            使用管道將字符串stand-by傳入awk,返回其長度。

            $ echo "Stand-by" | awk '{print length($0)}'
            8

            設(shè)置文件名為一變量,管道輸出到awk,返回不帶擴(kuò)展名的文件名。

            $ STR="mydoc.txt"
            $ echo $STR | awk '{print subst($STR, 1, 5)}'
            mydoc

            設(shè)置文件名為一變量,管道輸出到awk,只返回其擴(kuò)展名。
            $ STR="mydoc.txt"
            $ echo $STR | awk '{print substr($STR, 7)}'
            txt
            婷婷久久综合九色综合九七| 亚洲一本综合久久| 国产精品永久久久久久久久久| 无码专区久久综合久中文字幕| 狠狠色丁香婷婷久久综合| 国产成人久久久精品二区三区| 99久久久精品| 久久美女人爽女人爽| 久久福利青草精品资源站| 91精品国产91久久久久久蜜臀| 久久久精品免费国产四虎| 亚洲国产精品热久久| 99久久精品国产一区二区蜜芽| 国产巨作麻豆欧美亚洲综合久久| 国产A级毛片久久久精品毛片| 国产视频久久| 久久久这里有精品| 久久99精品久久久久久久久久| 国产精品女同久久久久电影院| 久久最新精品国产| 久久精品国产亚洲AV不卡| 国产精品美女久久福利网站| 一本一本久久a久久综合精品蜜桃| 欧美va久久久噜噜噜久久| 99久久婷婷国产一区二区| 性做久久久久久久久浪潮| 无码超乳爆乳中文字幕久久| 国产精品久久久久影院嫩草| 久久综合久久综合久久| 香港aa三级久久三级老师2021国产三级精品三级在 | 99久久精品免费看国产免费| 国产精品久久久久久久久鸭| 久久亚洲精品成人AV| 91精品国产色综久久| 久久亚洲精品无码aⅴ大香| 久久se精品一区二区| 四虎国产精品成人免费久久| 国产亚洲婷婷香蕉久久精品| 久久人妻少妇嫩草AV蜜桃| 国产精品99久久久久久董美香| 久久精品国产亚洲AV久|