<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    無線&移動互聯網技術研發

    換位思考·····
    posts - 19, comments - 53, trackbacks - 0, articles - 283
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    awk使用

    Posted on 2009-11-29 11:53 Gavin.lee 閱讀(270) 評論(0)  編輯  收藏 所屬分類: Linux command

     


    調用awk有三種方式調用awk,第一種是命令行方式,如:
    Shell代碼
    1. awk [-F field-separator] 'commands' input-file(s)  

    這里,commands是真正的awk命令。上面例子中,-F域分隔符]是可選的,因為a w k使用空格作為缺省的域分隔符,因此如果要瀏覽域間有空格的文本,不必指定這個選項,但如果要瀏覽諸如 passwd文件,此文件各域以冒號作為分隔符,則必須指明- F選項:
    Shell代碼
    1. awk -F: 'commands' input-file  
    第二種方法是將所有a w k命令插入一個文件,并使 a w k程序可執行,然后用a w k命令解釋器作為腳本的首行,以便通過鍵入腳本名稱來調用它。
    第三種方式是將所有的awk命令插入一個單獨文件,然后調用:
    Shell代碼
    1. awk -f awk_script_ file input_file(s)  
    - f選項指明在文件awk_script_ file中的a w k腳本,input_file(s)是使用awk進行瀏覽的文件名。

    模式和動作
    任何awk語句都由模式和動作組成。在一個awk腳本中可能有許多語句。模式部分決定動作語句何時觸發及觸發事件。處理即對數據進行的操作。如果省略模式部分,動作將時刻保持執行狀態。模式可以是任何條件語句或復合語句或正則表達式。模式包括兩個特殊字段BEGIN和END。使用BEGIN語句設置計數和打印頭。BEGIN語句使用在任何文本瀏覽動作之前,之后文本瀏覽動作依據輸入文件開始執行。 END語句用來在awk完成文本瀏覽動作后打印輸出文本總數和結尾狀態標志。如果不特別指明模式, awk總是匹配或打印行數。實際動作在大括號{ }內指明。動作大多數用來打印,但是還有些更長的代碼諸如 if和循環(looping)語句及循環退出結構。如果不指明采取動作, awk將打印出所有瀏覽出來的記錄。

    域和記錄
    awk執行時,其瀏覽域標記為$1,$2 . . . $n。這種方法稱為域標識。使用這些域標識將更容易對域進行進一步處理。使用$1,$3表示參照第1和第3域,注意這里用逗號做域分隔。如果希望打印一個有5個域的記錄的所有域,不必指明 $1,$2,$3,$4 ,$5,可使用$0,意即所有域。awk瀏覽時,到達一新行,即假定到達包含域的記錄末尾,然后執行新記錄下一行的讀動作,并重新設置域分隔。注意執行時不要混淆符號$和shell提示符$,它們是不同的。

    打印所有域的信息
    Shell代碼
    1. /home/l/g/tomotoboy >who   
    2. liuzk423   pts/6        Jul 20 08:27    (219.245.104.240)   
    3. tomotoboy   pts/16       Aug  7 23:33   (219.221.98.71)   
    4. liuqingaihn   pts/21       Aug  7 23:10 (116.29.229.116)   
    5. guise      pts/35       Aug  7 21:13    (58.41.162.27)   
    6. uyty       pts/38       Aug  7 22:09    (p3213-ipbf803souka.saitama.ocn.ne.jp)   
    7. yagamil    pts/46       Aug  7 20:48    (199.40.206.191)   
    8. /home/l/g/tomotoboy >who | awk '{print $0}'  
    9. liuzk423   pts/6        Jul 20 08:27    (219.245.104.240)   
    10. tomotoboy   pts/16       Aug  7 23:33   (219.221.98.71)   
    11. liuqingaihn   pts/21       Aug  7 23:10 (116.29.229.116)   
    12. guise      pts/35       Aug  7 21:13    (58.41.162.27)   
    13. uyty       pts/38       Aug  7 22:09    (p3213-ipbf803souka.saitama.ocn.ne.jp)   
    14. yagamil    pts/46       Aug  7 20:48    (199.40.206.191)  


    抽取第一域,并打印出來:
    Shell代碼
    1. /home/l/g/tomotoboy >who|awk '{print $1}'  
    2. liuzk423   
    3. tomotoboy   
    4. liuqingaihn   
    5. guise   
    6. uyty   
    7. yagamil  


    打印第一域、第三域
    Shell代碼
    1. /home/l/g/tomotoboy >who | awk '{print $1"\t"$3}'  
    2. liuzk423        Jul   
    3. tomotoboy       Aug   
    4. liuqingaihn     Aug   
    5. guise           Aug   
    6. uyty            Aug   
    7. yagamil         Aug  


    打印信息頭和信息尾
    Shell代碼
    1. /home/l/g/tomotoboy >who | awk  'BEGIN {print "--------BEGIN-------\n"} {print $1"\t"$3} END {print "----------END-------"}'  
    2. --------BEGIN-------   
    3.   
    4. liuzk423        Jul   
    5. tomotoboy       Aug   
    6. liuqingaihn     Aug   
    7. guise   Aug   
    8. uyty    Aug   
    9. kenhq   Aug   
    10. yagamil Aug   
    11. ----------END-------  


    如果第一個域等于tomotoboy
    Shell代碼
    1. /home/l/g/tomotoboy >who | awk  '{if ($1~/tomotoboy/) print $0}'  
    2. tomotoboy   pts/16       Aug  7 23:33   (219.221.98.71)  


    如果行的域中包含tomotoboy就打印它
    Shell代碼
    1. /home/l/g/tomotoboy >who | awk  '$0 ~/tomotoboy/'  
    2. tomotoboy   pts/16       Aug  7 23:33   (219.221.98.71)  


    不匹配
    Shell代碼
    1. /home/l/g/tomotoboy >who | awk  '{if ($1!~/tomotoboy/) print $0}'  
    2. liuzk423   pts/6        Jul 20 08:27    (219.245.104.240)   
    3. uyty       pts/38       Aug  7 22:09    (p3213-ipbf803souka.saitama.ocn.ne.jp)   
    4. kenhq      pts/40       Aug  7 23:46    (116.77.50.7)   
    5. yagamil    pts/46       Aug  7 20:48    (199.40.206.191)   
    6.   
    7. /home/l/g/tomotoboy >who | awk  '$0  !~/tomotoboy/'  
    8. liuzk423   pts/6        Jul 20 08:27    (219.245.104.240)   
    9. liuqingaihn   pts/21       Aug  7 23:54 (116.29.229.116)   
    10. uyty       pts/38       Aug  7 22:09    (p3213-ipbf803souka.saitama.ocn.ne.jp)   
    11. kenhq      pts/40       Aug  7 23:46    (116.77.50.7)   
    12. yagamil    pts/46       Aug  7 20:48    (199.40.206.191)  


    行首
    打印行首包含to的行
    Shell代碼
    1. /home/l/g/tomotoboy >who | awk  '/^to/'  
    2. tomotoboy   pts/16       Aug  7 23:33   (219.221.98.71)  

    AND
    打印第一域為tomotoboy,第三域為Aug的行
    Shell代碼
    1. /home/l/g/tomotoboy >who | awk  '{if ($1=/tomotoboy/ && $2=/Aug/) print $0}'  
    2. awk: syntax error near line 1  
    3. awk: illegal statement near line 1  
    4. /home/l/g/tomotoboy >who | awk  '{if ($1~/tomotoboy/ && $3~/Aug/) print $0}'  
    5. tomotoboy   pts/16       Aug  7 23:33   (219.221.98.71)  

    注意區分“=”與“==”,獲得兩種截然不同的結果
    Shell代碼
    1. /home/l/g/tomotoboy >who | awk  '{if ($1="tomotoboy" && $3="Aug") print $0}'  
    2. tomotoboy pts/6 Aug 20 08:27 (219.245.104.240)   
    3. tomotoboy pts/16 Aug 7 23:33 (219.221.98.71)   
    4. tomotoboy pts/21 Aug 8 00:05 (116.29.229.116)   
    5. tomotoboy pts/35 Aug 8 00:05 (116.29.229.116)   
    6. tomotoboy pts/38 Aug 7 22:09 (p3213-ipbf803souka.saitama.ocn.ne.jp)   
    7. tomotoboy pts/40 Aug 7 23:46 (116.77.50.7)   
    8. tomotoboy pts/46 Aug 7 20:48 (199.40.206.191)  


    Shell代碼
    1. /home/l/g/tomotoboy >who | awk  '{if ($1=="tomotoboy" && $3=="Aug") print $0}'  
    2. tomotoboy   pts/16       Aug  7 23:33   (219.221.98.71)  


    awk內置變量
    Shell代碼
    1. /home/l/g/tomotoboy >who|awk '{print NF,NR,$0}'  
    2. 6 1 liuzk423   pts/6        Jul 20 08:27        (219.245.104.240)   
    3. 6 2 tomotoboy   pts/16       Aug  7 23:33       (219.221.98.71)   
    4. 6 3 liuqingaihn   pts/21       Aug  8 00:05     (116.29.229.116)   
    5. 6 4 liuqingaihn   pts/35       Aug  8 00:05     (116.29.229.116)   
    6. 6 5 uyty       pts/38       Aug  7 22:09        (p3213-ipbf803souka.saitama.ocn.ne.jp)   
    7. 6 6 kenhq      pts/40       Aug  7 23:46        (116.77.50.7)   
    8. 6 7 yagamil    pts/46       Aug  7 20:48        (199.40.206.191)  


    awk內置字符串函數
    awk內置字符串函數,awk又很多字符處理函數,這里以length為例
    Shell代碼
    1. /home/l/g/tomotoboy >who| awk '{print length($1)" "$1}'  
    2. 8 liuzk423   
    3. 9 tomotoboy   
    4. 11 liuqingaihn   
    5. 11 liuqingaihn   
    6. 5 kenhq   
    7. 7 yagamil  

    如果第一域的長度大于7就輸出
    Shell代碼
    1. /home/l/g/tomotoboy >who| awk '{if(length($1)>7) print length($1)" "$1}'  
    2. 8 liuzk423   
    3. 9 tomotoboy   
    4. 11 liuqingaihn   
    5. 11 liuqingaihn  


    字符串屏蔽序列
    使用字符串或正則表達式時,有時需要在輸出中加入一新行或查詢一元字符。打印一新行時,(新行為字符\n) ,給出其屏蔽序列,以不失其特殊含義,用法為在字符串前加入反斜線。例如使用\n強迫打印一新行。如果使用正則表達式,查詢花括號({ }) ,在字符前加反斜線,如/ \ { /,將在awk中失掉其特殊含義。
    Shell代碼
    1. \b 退格鍵      \t tab鍵   
    2. \f 走紙換頁    \ddd 八進制值   
    3. \n 新行        \c 任意其他特殊字符,例如\\為反斜線符號   
    4. \r 回車鍵   
    5. /home/l/g/tomotoboy >who |awk '{print $1"\t""\t"$2"\n"}'  
    6. liuzk423                pts/6  
    7.   
    8. tomotoboy               pts/16  
    9.   
    10. liuqingaihn             pts/21  
    11.   
    12. liuqingaihn             pts/35  
    13.   
    14. kenhq                   pts/40  
    15.   
    16. yagamil                 pts/46  


    printf
    printf修飾符,prinf基本域C語言的printf相同下面開始舉例
    Shell代碼
    1. /home/l/g/tomotoboy >echo "65" |awk '{printf "%c\n",$0}'  
    2. A   
    3. /home/l/g/tomotoboy >echo "65" |awk '{printf "%d\n",$0}'  
    4. 65  
    5. /home/l/g/tomotoboy >echo "65" |awk '{printf "%c\t\t%d\n",$0,$0}'  
    6. A               65  


    awk數組
    Java代碼
    1. /home/l/g/tomotoboy >awk 'BEGIN {print split("123#456#789",myarray,"#")}'  
    2. 3  

    在上面的例子中,split返回數組myarray下標數。實際上myarray數組為:
    myarray[1]=123
    myarray[2]=456
    myarray[3]=789
    數組使用前,不必定義,也不必指定數組元素個數。經常使用循環來訪問數組。下面是一種循環類型的基本結構:
    For (element in array) print array[element]
    對于記錄“123#456#789” ,先使用split函數劃分它,再使用循環打印各數組元素。操作腳本如下:
    Shell代碼
    1. #!/bin/awk -f   
    2. #name: arraytest.awk   
    3. #pprint out am array   
    4. BEGIN{   
    5. record="123#456#789";   
    6. split(record,myarray,"#")}   
    7. END { for (i in myarray) {print myarray[i]}}  

    要運行腳本,使用/dev/null作為輸入文件。
    Shell代碼
    1. /home/l/g/tomotoboy >arraytest.awk /dev/null   
    2. 456  
    3. 789  
    4. 123  
    小結
    awk語言學起來可能有些復雜,但使用它來編寫一行命令或小腳本并不太難。awk是shell編程的一個重要工具。在shell命令或編程中,雖然可以使用awk強大的文本處理能力,但是并不要求你成為這方面的專家
    主站蜘蛛池模板: 黑人粗长大战亚洲女2021国产精品成人免费视频 | 亚洲人成图片小说网站| 亚洲精品欧洲精品| 青青草无码免费一二三区| 亚洲人成网亚洲欧洲无码久久| 久久精品亚洲中文字幕无码网站| 久久精品a亚洲国产v高清不卡| 亚洲午夜精品国产电影在线观看| 亚洲av永久无码精品网址| 免费看美女让人桶尿口| 亚洲成av人在线观看网站| 狼友av永久网站免费观看| 国产天堂亚洲国产碰碰| 免费在线观看污网站| 一级毛片免费播放试看60分钟| 3d成人免费动漫在线观看| 亚洲ⅴ国产v天堂a无码二区| 99re在线精品视频免费| youjizz亚洲| 日韩伦理片电影在线免费观看| 亚洲视频精品在线| 在线v片免费观看视频| 亚洲欧美日韩中文字幕一区二区三区 | A在线观看免费网站大全| 亚洲a∨无码男人的天堂| 韩国二级毛片免费播放| 亚洲AV第一成肉网| 亚洲综合区小说区激情区| 久久青草免费91线频观看站街| www.亚洲色图| 久久久久国产精品免费网站| 国产99视频精品免费视频76| 中文亚洲成a人片在线观看| 日韩视频免费在线观看| 亚洲最大的成人网| 亚洲成a人一区二区三区| 国产激情免费视频在线观看| 亚洲砖码砖专无区2023| 国产成人精品久久亚洲高清不卡 | 亚洲色成人网站WWW永久四虎| 91精品免费高清在线|