簡體   English   中英

使用awk命令匹配多個模式

[英]match mutiple patterns using awk command

我的檔案看起來像

10.183.227.46|242066391737|73633662;244809|com.com|com.com|2001|CCA-I|0|[29/Dec/2016:00:00:40]|26|RULE_31893406,RULE_31893405,RULE_416241598|4106,4105,4000|2006,2005,5000|0|0|0|0|2621440|3000|-|-|1003:0,1013:0,1010:Home|244809|0|117,115,40|-|-|

我想查看在第24字段中包含117並在第6字段中包含2001文件

我在用

awk -F "|" '{if($6==2001 && $24==117)print }' 29_DEC_2016.1

但由於第24個字段可以包含多個用逗號分隔的值,因此無法得到正確的結果

$ awk -F\| '$6=="2001" && $25 ~ /(^|,)117($|,)/' file

$6等於"2001" (不要使用2001因為如果您要搜索0 ,則$6==0將使隱式打印失敗),而$25恰好包含117在字符串開頭 ^或( |開頭 字符串結尾或逗號(以防萬一,您可以在空格中輸入)。

測試后一部分:

$ cat foo
117,2,3   # good
1,117,3   # good
1,2,117   # good
1117,2,3  # bad
1,1117,3  # bad
1,2,1177  # bad
$ awk '$1~/(^|,)117($|,)/' foo
117,2,3   # good
1,117,3   # good
1,2,117   # good

或者使用GNU awksplit功能與柱,去限制提取的話,做該值的檢查

awk -F "|" '{split($25,array1,","); if ( $6 == "2001" && array1[1] == "117" ){print} }' file

如果該元素可以在任何地方欄出現,只是~正則表達式匹配就足夠了。

awk -F "|" '$6 == "2001" && $25 ~ /117/' file

有關更嚴格的regEx匹配,請參考James Brown的答案

awk -F'[|,]' '{print $6,$(NF-5)}'  file

2001 117

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM