標籤:blog http 使用 strong 檔案 資料
shell之文本過濾(awk)分類: linux shell指令碼學習2012-09-19 15:53 1241人閱讀 評論(0) 收藏 舉報shellRegex指令碼任務語言
如果要格式化報文或從一個大的文字檔中抽取資料包,那麼awk可以完成這些任務。
為了擷取所需資訊,文本必須格式化,也就是說要使用域分隔字元來劃分抽取域,分隔字元可以使任一字元。
awk語言的最準系統是在檔案或字串中基於指定規格瀏覽和抽取資訊。awk抽取資訊後,才能進行其他文本操作。awk指令碼通常用來格式化文字檔中的資訊。
1.調用awk
①命令列的方式:
[python] view plaincopy
- awk [-F field-separator] ‘commands‘ input-file(s) //‘commands’是真正的awk命令
[-F 域分隔字元]是可選的,awk使用空格作為預設的域分隔字元
②將所有awk命令插入到一個檔案,是awk程式可執行,然後使用awk命令直譯器作為指令碼的首行,以便通過鍵入指令碼名稱來調用。
③將所有的awk命令插入到一個單獨檔案,然後調用。
[python] view plaincopy
- 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
- M.Tansley 05/99 48311 Green 8 40 44
- J.Lulu 06/99 48317 green 9 24 26
- P.Bunny 02/99 48 Yellow 12 35 28
- J.Troll 07/99 4842 Brown-3 12 26 26
- L.Tansley 05/99 4712 Brown-2 12 30 28
首先要抽取檔案中的資訊,將它們劃分成域的形式。
②儲存awk輸出
有兩種方式儲存shell提示符下的awk指令碼輸出。
其一是使用輸出重新導向符號 >檔案名稱
[python] view plaincopy
- awk ‘{print $0}‘ readfile > savefile
第二種方法是使用tee命令,在輸出到檔案的同時輸出到螢幕。
[python] view plaincopy
- awk ‘{print $0}‘ readfile | tee savefile
③使用標準輸入
實際上任何指令碼都是從標準輸入中接受輸入的。
[python] view plaincopy
- 方式一:$awkscript readfile
- 方式二(重新導向):$awkscript < radfile
- 方式三(管道):$readfile | awkscript
④列印所有記錄
[python] view plaincopy
- awk ‘{print $0}‘ readfile //列印整個檔案
⑤列印單獨記錄
使用$1,$2...$n,域標示之間用逗號隔開
[python] view plaincopy
- awk ‘{print $1,$4}‘ readfile //列印域1和域4
⑥列印報告頭
[python] view plaincopy
- awk ‘BEGIN {print "xxxx"}{print $1"\t"$4}‘ readfile
⑦列印資訊尾
[python] view plaincopy
- awk ‘BEGIN {print "xxx"} {print $1} END {print "end"}‘ readfile
4.awk中的Regex
這裡Regex用斜線括起來, /字串/
①匹配
使域號匹配運算式,使用符號‘~‘後緊跟Regex,也可以使用if語句。awk中if語句後面的條件用()括起來。
[python] view plaincopy
- awk ‘{if($4~/字串/) print $0}‘ readfile //如果域4包含匹配的字串,列印整句
- awk ‘{$0 ~ /字串/‘} readfile //如果記錄包含匹配的字串,列印整句
②精確匹配
[python] view plaincopy
- awk ‘{if($3 ~ /字串/) print $0}‘ readfile //包含字串的所有記錄都匹配,不精確
[python] view plaincopy
- awk ‘$3 == "字串" {print $0}‘ readfile //確保只有字串得以匹配,精確匹配
③不匹配
[python] view plaincopy
- awk ‘{if($4 !~ /匹配字串/) print $0}‘ readfile
④小於
[python] view plaincopy
- awk ‘{if($6<$7) print "xxx"}‘ readfile
⑤小於等於
[python] view plaincopy
- awk ‘{if($6<=$7) print "xxx"}‘ readfile
⑥大於
[python] view plaincopy
- awk ‘{if($6》$7) print "xxx"}‘ readfile
⑦設定大小寫
為查詢大小寫資訊,可以使用[ ]符號
[python] view plaincopy
- awk ‘/[Gg]reen/‘ readfile //匹配green Green的行
⑧任一字元
[python] view plaincopy
- awk ‘$1 ~/^...a/‘ readfile //抽取域1,其記錄第一域的第四個字元時a
⑨或關係匹配
使用或關係符時,語句必須用圓括弧括起來
[python] view plaincopy
- awk ‘$0 ~ /(字串1|字串2)/‘ readfile //匹配|兩邊模式之一
⑩行首
[python] view plaincopy
- awk ‘/^字串/‘ readfile
其他
&& AND:語句兩邊必須同時為真
|| OR:語句兩邊同時或其中一邊匹配為真
! 非 求逆