1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      如何在Linux中使用awk命令-創(chuàng)新互聯(lián)

      這篇文章給大家介紹如何在Linux中使用awk命令,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

      成都創(chuàng)新互聯(lián)公司長(zhǎng)期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為陽新企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì),陽新網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。一、awk命令簡(jiǎn)介

      awk被稱為文本處理三劍客之一,其名稱得自于它的創(chuàng)始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個(gè)字母。實(shí)際上 AWK 的確擁有自己的語言: AWK 程序設(shè)計(jì)語言 , 三位創(chuàng)建者已將它正式定義為“樣式掃描和處理語言”。它允許您創(chuàng)建簡(jiǎn)短的程序,這些程序讀取輸入文件、為數(shù)據(jù)排序、處理數(shù)據(jù)、對(duì)輸入執(zhí)行計(jì)算以及生成報(bào)表,還有無數(shù)其他的功能。
      所以說awk是一個(gè)強(qiáng)大的文本分析工具,相對(duì)于grep的查找,sed的編輯,awk在其對(duì)數(shù)據(jù)分析并生成報(bào)告時(shí),顯得尤為強(qiáng)大。簡(jiǎn)單來說awk就是把文件逐行的讀入,以空格為默認(rèn)分隔符將每行切片,切開的部分再進(jìn)行各種分析處理。

      二、awk命令格式及選項(xiàng)

      語法形式

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

      常用命令選項(xiàng)

      -F fs fs指定輸入分隔符,fs可以是字符串或正則表達(dá)式,如-F:
      -v var=value 賦值一個(gè)用戶定義變量,將外部變量傳遞給awk
      -f scripfile 從腳本文件中讀取awk命令
      -m[fr] val 對(duì)val值設(shè)置內(nèi)在限制,-mf選項(xiàng)限制分配給val的大塊數(shù)目;-mr選項(xiàng)限制記錄的大數(shù)目。這兩個(gè)功能是Bell實(shí)驗(yàn)室版awk的擴(kuò)展功能,在標(biāo)準(zhǔn)awk中不適用。

      三、awk的原理

      awk 'BEGIN{ commands } pattern{ commands } END{ commands }'

      第一步:執(zhí)行BEGIN{ commands }語句塊中的語句;
      第二步:從文件或標(biāo)準(zhǔn)輸入(stdin)讀取一行,然后執(zhí)行pattern{ commands }語句塊,它逐行掃描文件,從第一行到最后一行重復(fù)這個(gè)過程,直到文件全部被讀取完畢。
      第三步:當(dāng)讀至輸入流末尾時(shí),執(zhí)行END{ commands }語句塊。
      BEGIN語句塊在awk開始從輸入流中讀取行之前被執(zhí)行,這是一個(gè)可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通常可以寫在BEGIN語句塊中。

      END語句塊在awk從輸入流中讀取完所有的行之后即被執(zhí)行,比如打印所有行的分析結(jié)果這類信息匯總都是在END語句塊中完成,它也是一個(gè)可選語句塊。

      pattern語句塊中的通用命令是最重要的部分,它也是可選的。如果沒有提供pattern語句塊,則默認(rèn)執(zhí)行{ print },即打印每一個(gè)讀取到的行,awk讀取的每一行都會(huì)執(zhí)行該語句塊。

      四、awk 基本用法

      awk的調(diào)用有三種方式

      1.命令行方式

      awk [-F field-separator] 'commands' input-file(s)

      其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的文件。
      在awk中,文件的每一行中,由域分隔符分開的每一項(xiàng)稱為一個(gè)域。通常,在不指名-F域分隔符的情況下,默認(rèn)的域分隔符是空格。

      2.shell腳本方式

      awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file

      一個(gè)awk腳本通常由:BEGIN語句塊、能夠使用模式匹配的通用語句塊、END語句塊3部分組成,這三個(gè)部分是可選的。任意一個(gè)部分都可以不出現(xiàn)在腳本中,腳本通常是被單引號(hào)或雙引號(hào)中,例如:

      awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename
      awk "BEGIN{ i=0 } { i++ } END{ print i }" filename

      3.將所有的awk命令插入一個(gè)單獨(dú)文件,然后調(diào)用

      awk -f awk-script-file input-file(s)

      其中,-f選項(xiàng)加載awk-script-file中的awk腳本,input-file(s)跟上面的命令行方式是一樣的。
      我們通過幾個(gè)簡(jiǎn)單的示例來進(jìn)一步了解awk的用法

      [root@localhost ~]# awk '{print $0}' /etc/passwd 
      root:x:0:0:root:/root:/bin/bash
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
      sync:x:5:0:sync:/sbin:/bin/sync
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      halt:x:7:0:halt:/sbin:/sbin/halt
      .........................................................................
      [root@localhost ~]# echo 123|awk '{print "hello,awk"}'
      hello,awk
      
      [root@localhost ~]# awk '{print "hi"}' /etc/passwd
      hi
      hi
      hi
      hi
      hi
      hi
      hi
      hi
      hi
      .........................................................................


      我們指定/etc/passwd作為輸出文件,執(zhí)行awk時(shí),它就會(huì)依次對(duì)/etc/passwd中的每一行執(zhí)行print命令。

      如何在Linux中使用awk命令

      awk工作流程是這樣的:讀入有'\n'換行符分割的一條記錄,然后將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個(gè)域,$n表示第n個(gè)域。默認(rèn)域分隔符是"空白鍵" 或 "[tab]鍵",所以$1表示登錄用戶,$3表示登錄用戶ip,以此類推。如

      打印/etc/passwd下所有的用戶名

      [root@localhost ~]# awk -F: '{print $1}' /etc/passwd
      root
      bin
      daemon
      adm

      ........................................................................
      打印/etc/passwd下所有的用戶名及UID

      [root@localhost ~]# awk -F: '{print $1,$3}' /etc/passwd
      root 0
      bin 1
      daemon 2

      ........................................................................
      以u(píng)sername: XXX  uid: XXX格式輸出

      [root@localhost ~]# awk -F: '{print "username: " $1 "\t\tuid: "$3}' /etc/passwd
      username: root   uid: 0
      username: bin    uid: 1
      username: daemon    uid: 2
      ........................................................................
      五、awk內(nèi)置變量
      變量描述
      \$n當(dāng)前記錄的第n個(gè)字段,字段間由FS分隔
      \$0完整的輸入記錄
      ARGC命令行參數(shù)的數(shù)目
      ARGIND命令行中當(dāng)前文件的位置(從0開始算)
      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各文件分別計(jì)數(shù)的行號(hào)
      FS字段分隔符(默認(rèn)是任何空格)
      IGNORECASE如果為真,則進(jìn)行忽略大小寫的匹配
      NF一條記錄的字段的數(shù)目
      NR已經(jīng)讀出的記錄數(shù),就是行號(hào),從1開始
      OFMT數(shù)字的輸出格式(默認(rèn)值是%.6g)
      OFS輸出記錄分隔符(輸出換行符),輸出時(shí)用指定的符號(hào)代替換行符
      ORS輸出記錄分隔符(默認(rèn)值是一個(gè)換行符)
      RLENGTH由match函數(shù)所匹配的字符串的長(zhǎng)度
      RS記錄分隔符(默認(rèn)是一個(gè)換行符)
      RSTART由match函數(shù)所匹配的字符串的第一個(gè)位置
      SUBSEP數(shù)組下標(biāo)分隔符(默認(rèn)值是/034)

      示例

      [root@localhost ~]# echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print "Line No:"NR", No of fields:"NF, "$0="$0, "$1="$1, "$2="$2, "$3="$3}'
      Line No:1, No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3
      Line No:2, No of fields:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5
      Line No:3, No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7

      使用print $NF可以打印出一行中的最后一個(gè)字段,使用$(NF-1)則是打印倒數(shù)第二個(gè)字段,其他以此類推:

      [root@localhost ~]# echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $NF}'
      f3
      f5
      [root@localhost ~]# echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $(NF-1)}'
      f2
      f4

      統(tǒng)計(jì)/etc/passwd:文件名,每行的行號(hào),每行的列數(shù),對(duì)應(yīng)的完整行內(nèi)容:

      [root@localhost ~]# awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
      filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
      filename:/etc/passwd,linenumber:2,columns:7,linecontent:bin:x:1:1:bin:/bin:/sbin/nologin
      filename:/etc/passwd,linenumber:3,columns:7,linecontent:daemon:x:2:2:daemon:/sbin:/sbin/nologin

      統(tǒng)計(jì)/etc/passwd文件中的命令行參數(shù)ARGC,文件行號(hào)FNR,字段分隔符FS,一條記錄的字段數(shù)目NF,已經(jīng)讀出的記錄數(shù)(默認(rèn)是行號(hào))NR

      [root@localhost ~]# awk -F: 'BEGIN{printf "%4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR}' /etc/passwd
      FILENAME ARGC FNR  FS  NF  NR
      ---------------------------------------------
      /etc/passwd  2  1  :  7  1
      /etc/passwd  2  2  :  7  2
      /etc/passwd  2  3  :  7  3
      六、awk高級(jí)用法

      1.awk賦值運(yùn)算

      賦值語句運(yùn)算符:= += -= *= /= %= ^= **=

      例如:a+=5;等價(jià)于a=a+5

      [root@localhost ~]# awk 'BEGIN{a=5;a+=5;print a}'
      10

      2.awk正則運(yùn)算
      輸出包含有root的行,并打印用戶名和UID及原行內(nèi)容

      [root@localhost ~]# awk -F: '/root/ {print $1,$3,$0}' /etc/passwd
      root 0 root:x:0:0:root:/root:/bin/bash
      operator 11 operator:x:11:0:operator:/root:/sbin/nologin

      我們發(fā)現(xiàn)找到了兩行,如果我們想找root開頭的行就要這樣寫:awk -F: '/^root/' /etc/passwd

      3.awk三目運(yùn)算

      [root@localhost ~]# awk 'BEGIN{a="b";print a=="b"?"ok":"err"}'
      ok
      [root@localhost ~]# awk 'BEGIN{a="b";print a=="c"?"ok":"err"}'
      err

      三目運(yùn)算其實(shí)就是一個(gè)判斷運(yùn)算,如果為真則輸出?后的內(nèi)容,如果為假則輸出:后的內(nèi)容

      4.awk的循環(huán)運(yùn)用

      if語句運(yùn)用

      [root@localhost ~]# awk 'BEGIN{ test=100;if(test>90){ print "vear good";} else{print "no pass";}}'
      vear good

      每條命令后用;結(jié)尾
      while循環(huán)運(yùn)用
      計(jì)算從1累加到100的值

      [root@localhost ~]# awk 'BEGIN{test=100;num=0;while(i<=test){num+=i; i++;}print num;}'
      5050
      for循環(huán)的運(yùn)用
      [root@localhost ~]# awk 'BEGIN{test=0;for(i=0;i<=100;i++){test+=i;}print test;}'
      5050
      do循環(huán)的運(yùn)用
      [root@localhost ~]# awk 'BEGIN{test=0;i=0;do{test+=i;i++}while(i<=100)print test;}'
      5050

      5.awk的數(shù)組運(yùn)用

      數(shù)組是awk的靈魂,處理文本中最不能少的就是它的數(shù)組處理。因?yàn)閿?shù)組索引(下標(biāo))可以是數(shù)字和字符串在awk中數(shù)組叫做關(guān)聯(lián)數(shù)組(associative arrays)。awk 中的數(shù)組不必提前聲明,也不必聲明大小。數(shù)組元素用0或空字符串來初始化,這根據(jù)上下文而定。一般而言,awk中的數(shù)組用來從記錄中收集信息,可以用于計(jì)算總和、統(tǒng)計(jì)單詞以及跟蹤模板被匹配的次數(shù)等等。
      顯示/etc/passwd的賬戶

      awk -F: 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
      0 root
      1 bin
      2 daemon
      3 adm
      4 lp
      5 sync
      ........................................................................

      6.awk字符串函數(shù)的運(yùn)用

      函數(shù)名 描述
      sub 匹配記錄中大、最靠左邊的子字符串的正則表達(dá)式,并用替換字符串替換這些字符串。如果沒有指定目標(biāo)字符串就默認(rèn)使用整個(gè)記錄。替換只發(fā)生在第一次匹配的 時(shí)候
      sub (regular expression, substitution string):
      sub (regular expression, substitution string, target string)

      實(shí)例:

       awk '{ sub(/test/, "mytest"); print }' testfile
           awk '{ sub(/test/, "mytest"); $1}; print }' testfile

      第一個(gè)例子在整個(gè)記錄中匹配,替換只發(fā)生在第一次匹配發(fā)生的時(shí)候。如要在整個(gè)文件中進(jìn)行匹配需要用到gsub

      第二個(gè)例子在整個(gè)記錄的第一個(gè)域中進(jìn)行匹配,替換只發(fā)生在第一次匹配發(fā)生的時(shí)候。
      gsub 整個(gè)文檔中進(jìn)行匹配
      gsub (regular expression, substitution string)
      gsub (regular expression, substitution string, target string)

      實(shí)例:

       awk '{ gsub(/test/, "mytest"); print }' testfile
           awk '{ gsub(/test/, "mytest" , $1) }; print }' testfile

      第一個(gè)例子在整個(gè)文檔中匹配test,匹配的都被替換成mytest。

      第二個(gè)例子在整個(gè)文檔的第一個(gè)域中匹配,所有匹配的都被替換成mytest。
      index 返回子字符串第一次被匹配的位置,偏移量從位置1開始
      index(string, substring)

      實(shí)例:

               awk '{ print index("test", "mytest") }' testfile

      實(shí)例返回test在mytest的位置,結(jié)果應(yīng)該是3。
      substr 返回從位置1開始的子字符串,如果指定長(zhǎng)度超過實(shí)際長(zhǎng)度,就返回整個(gè)字符串
      substr( string, starting position )
      substr( string, starting position, length of string )

      實(shí)例:

               awk '{ print substr( "hello world", 7,11 ) }'

      上例截取了world子字符串。
      split 可按給定的分隔符把字符串分割為一個(gè)數(shù)組。如果分隔符沒提供,則按當(dāng)前FS值進(jìn)行分割
      split( string, array, field separator )
      split( string, array )

      實(shí)例:

               awk '{ split( "20:18:00", time, ":" ); print time[2] }'

      上例把時(shí)間按冒號(hào)分割到time數(shù)組內(nèi),并顯示第二個(gè)數(shù)組元素18。
      length 返回記錄的字符數(shù)
      length( string )
      length

      實(shí)例:

       awk '{ print length( "test" ) }' 
           awk '{ print length }' testfile

      第一個(gè)實(shí)例返回test字符串的長(zhǎng)度。

      第二個(gè)實(shí)例返回testfile文件中第條記錄的字符數(shù)。
      match 返回在字符串中正則表達(dá)式位置的索引,如果找不到指定的正則表達(dá)式則返回0。match函數(shù)會(huì)設(shè)置內(nèi)建變量RSTART為字符串中子字符串的開始位 置,RLENGTH為到子字符串末尾的字符個(gè)數(shù)。substr可利于這些變量來截取字符串

      match( string, regular expression )

      實(shí)例:

       awk '{start=match("this is a test",/[a-z]+$/); print start}'
           awk '{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'

      第一個(gè)實(shí)例打印以連續(xù)小寫字符結(jié)尾的開始位置,這里是11。

      第二個(gè)實(shí)例還打印RSTART和RLENGTH變量,這里是11(start),11(RSTART),4(RLENGTH)。
      toupper和tolower 可用于字符串大小間的轉(zhuǎn)換,該功能只在gawk中有效

      toupper( string )
      tolower( string )

      實(shí)例:

               awk '{ print toupper("test"), tolower("TEST") }'

      關(guān)于如何在Linux中使用awk命令就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。


      名稱欄目:如何在Linux中使用awk命令-創(chuàng)新互聯(lián)
      網(wǎng)頁網(wǎng)址:http://www.ef60e0e.cn/article/cedojh.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        蒙山县| 张家港市| 商河县| 南雄市| 安化县| 武冈市| 中卫市| 凉山| 吴川市| 会泽县| 新蔡县| 浦东新区| 黄梅县| 安泽县| 县级市| 武平县| 盐池县| 大姚县| 冀州市| 定安县| 农安县| 海南省| 娄烦县| 云梦县| 高碑店市| 横峰县| 望都县| 长白| 宜黄县| 含山县| 隆德县| 济宁市| 炎陵县| 四平市| 西青区| 巴青县| 清远市| 郸城县| 绿春县| 临海市| 盐边县|