使用awk命令匹配多个模式

时间:2017-01-03 10:56:25

标签: linux awk

我的文件看起来像

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个字段可以包含多个逗号分隔的值 我没有得到正确的结果

3 个答案:

答案 0 :(得分:3)

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

$6等于"2001"(不要只使用2001,因为如果您正在搜索0$6==0将无法隐式打印)和{ {1}}完全包含$25(前面跟着字符串开头 117或(^字符串结尾< / em>或逗号|(你可以扔进太空以防万一))。

测试后一部分:

,

答案 1 :(得分:2)

或者在GNU awk去限制器的列上使用split,函数来提取单词并对该值进行检查

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

如果元素可以出现在列的任何位置,那么只需~正则表达式就足够了。

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

请参阅此James Brown's answer以获得更严格的regEx匹配。

答案 2 :(得分:0)

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

2001 117