shell之文本過濾(awk)

來源:互聯網
上載者:User

標籤:blog   http   使用   strong   檔案   資料   

 shell之文本過濾(awk)分類: linux shell指令碼學習2012-09-19 15:53 1241人閱讀 評論(0) 收藏 舉報shellRegex指令碼任務語言

如果要格式化報文或從一個大的文字檔中抽取資料包,那麼awk可以完成這些任務。

為了擷取所需資訊,文本必須格式化,也就是說要使用域分隔字元來劃分抽取域,分隔字元可以使任一字元。

awk語言的最準系統是在檔案或字串中基於指定規格瀏覽和抽取資訊。awk抽取資訊後,才能進行其他文本操作。awk指令碼通常用來格式化文字檔中的資訊。

1.調用awk

①命令列的方式:

[python] view plaincopy 
  1. awk [-F field-separator] ‘commands‘ input-file(s)  //‘commands’是真正的awk命令  

[-F 域分隔字元]是可選的,awk使用空格作為預設的域分隔字元

②將所有awk命令插入到一個檔案,是awk程式可執行,然後使用awk命令直譯器作為指令碼的首行,以便通過鍵入指令碼名稱來調用。

③將所有的awk命令插入到一個單獨檔案,然後調用。

[python] view plaincopy 
  1. awk -f awk-script-file input-files(s)  


2.awk指令碼

在命令中調用awk時,awk指令碼由各種操作和模式組成。

awk每次讀一條記錄或一行,並使用指定的分隔字元分隔指定域。

①模式和動作

任何awk語句都是由模式和動作組成。模式部分決定動作語句何時觸發及觸發事件。處理即對資料進行的操作。如果省略模式,動作將時刻保持執行狀態。

模式可以使任何條件陳述式或複合運算式或Regex。

模式包含兩個特殊字元BEGIN和END。

BEGIN語句設定計數和列印頭。使用在任何文本瀏覽動作之前。

END語句用來在awk完成文本瀏覽動作後列印輸出文本總數和結尾狀態標誌,不特別指明模式,awk總是匹配或列印行數。

 

3.域和記錄

awk執行時,其瀏覽域標記為$1,$2,...$n。$n表示參照第n域,$0表示所有域,用逗號來做域分隔。

列印一個或所有域,使用print命令。這是一個awk動作,動作文法用‘{  }‘括起來。

①抽取域

例:

[python] view plaincopy 
  1. M.Tansley     05/99   48311   Green   8   40  44  
  2. J.Lulu     06/99   48317   green   9   24  26  
  3. P.Bunny    02/99   48      Yellow  12  35  28  
  4. J.Troll    07/99   4842    Brown-3 12  26  26  
  5. L.Tansley  05/99   4712    Brown-2 12  30  28  

首先要抽取檔案中的資訊,將它們劃分成域的形式。

②儲存awk輸出

有兩種方式儲存shell提示符下的awk指令碼輸出。

其一是使用輸出重新導向符號 >檔案名稱

[python] view plaincopy 
  1. awk ‘{print $0}‘ readfile > savefile  

第二種方法是使用tee命令,在輸出到檔案的同時輸出到螢幕。

[python] view plaincopy 
  1. awk ‘{print $0}‘ readfile | tee savefile  

③使用標準輸入

實際上任何指令碼都是從標準輸入中接受輸入的。

[python] view plaincopy 
  1. 方式一:$awkscript readfile  
  2. 方式二(重新導向):$awkscript < radfile  
  3. 方式三(管道):$readfile | awkscript  

④列印所有記錄

[python] view plaincopy 
  1. awk ‘{print $0}‘ readfile   //列印整個檔案  

⑤列印單獨記錄

使用$1,$2...$n,域標示之間用逗號隔開

[python] view plaincopy 
  1. awk ‘{print $1,$4}‘ readfile    //列印域1和域4  

⑥列印報告頭

[python] view plaincopy 
  1. awk ‘BEGIN {print "xxxx"}{print $1"\t"$4}‘ readfile  

⑦列印資訊尾

[python] view plaincopy 
  1. awk ‘BEGIN {print "xxx"} {print $1} END {print "end"}‘ readfile  

 

4.awk中的Regex

這裡Regex用斜線括起來, /字串/
①匹配

使域號匹配運算式,使用符號‘~‘後緊跟Regex,也可以使用if語句。awk中if語句後面的條件用()括起來。

[python] view plaincopy 
  1. awk ‘{if($4~/字串/) print $0}‘ readfile  //如果域4包含匹配的字串,列印整句  
  2. awk ‘{$0 ~ /字串/‘} readfile //如果記錄包含匹配的字串,列印整句  

②精確匹配

[python] view plaincopy 
  1. awk ‘{if($3 ~ /字串/) print $0}‘ readfile    //包含字串的所有記錄都匹配,不精確  
[python] view plaincopy 
  1. awk ‘$3 == "字串" {print $0}‘ readfile   //確保只有字串得以匹配,精確匹配  

③不匹配

[python] view plaincopy 
  1. awk ‘{if($4 !~ /匹配字串/) print $0}‘ readfile  

④小於

[python] view plaincopy 
  1. awk ‘{if($6<$7) print "xxx"}‘ readfile  

⑤小於等於

[python] view plaincopy 
  1. awk ‘{if($6<=$7) print "xxx"}‘ readfile  

⑥大於

[python] view plaincopy 
  1. awk ‘{if($6》$7) print "xxx"}‘ readfile  

⑦設定大小寫

為查詢大小寫資訊,可以使用[ ]符號

[python] view plaincopy 
  1. awk ‘/[Gg]reen/‘ readfile   //匹配green Green的行  

⑧任一字元

[python] view plaincopy 
  1. awk ‘$1 ~/^...a/‘ readfile  //抽取域1,其記錄第一域的第四個字元時a  

⑨或關係匹配

使用或關係符時,語句必須用圓括弧括起來

[python] view plaincopy 
  1. awk ‘$0 ~ /(字串1|字串2)/‘ readfile   //匹配|兩邊模式之一  

⑩行首

[python] view plaincopy 
  1. awk ‘/^字串/‘ readfile  

 

其他

&&   AND:語句兩邊必須同時為真

||  OR:語句兩邊同時或其中一邊匹配為真
! 非 求逆

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.