Linux 使用awk命令匹配多个模式

Linux 使用awk命令匹配多个模式,linux,awk,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|-

我的文件看起来像

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

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

awk -F "|" '{split($25,array1,","); if ( $6 == "2001" && array1[1] == "117" ){print} }' file
如果元素可以出现在列中的任何位置,只需一个
~
正则表达式匹配就足够了

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

有关更严格的正则表达式匹配,请参阅此项。

或在列上使用
GNU awk
split
函数和
de limiter提取单词并检查该值

awk -F "|" '{split($25,array1,","); if ( $6 == "2001" && array1[1] == "117" ){print} }' file
$ awk -F\| '$6=="2001" && $25 ~ /(^|,)117($|,)/' file
如果元素可以出现在列中的任何位置,只需一个
~
正则表达式匹配就足够了

awk -F "|" '$6 == "2001" && $25 ~ /117/' file
请参阅此项以了解更严格的正则表达式匹配

$ 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
$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


没有必要让117成为第一名number@Prafull:请参阅我的更新,它将解决您的问题,
$25
需要一些工作,如果其中有例如
1117
,则会失败。我现在没时间测试了++@詹姆斯布朗:考虑到同样的问题,考虑使用
长度
,可能你有更好的想法,可以随时更新新答案或mine@Inian看看我的解决方案,这是我目前能想到的最好的了。没有必要让117排在第一位number@Prafull:请参阅我的更新,它将解决您的问题,
$25
需要一些工作,如果其中有例如
1117
,则会失败。我现在没时间测试了++@詹姆斯布朗:考虑到同样的问题,考虑使用
长度
,可能你有更好的想法,可以随时更新新答案或mine@Inian请看我的解决方案,这是我目前能想到的最好的解决方案。
++
仅适用于正则表达式在我的答案中包含了对您答案的参考
/[,^]/
不“工作”,因为
[]
是一个括号表达式,其中字符按字面方式处理(有一些基于位置的例外),因此
[,^]
中的
^
是一个文字
^
字符,而不是字符串的regexp开头。类似地,
$
。你用
(^ |,)
所做的就是你所要做的事情的正确语法。@JamesBrown-非常好的信息和命令,先生,感谢你分享这些信息。
++
对于regEx only,在我的答案中包含了对你答案的参考
/[,^]/
不“工作”,因为
[]
是一个括号表达式,其中字符按字面方式处理(有一些基于位置的例外),因此
[,^]
中的
^
是一个文字
^
字符,而不是字符串的regexp开头。类似地,
$
。您使用
(^ |,)
所做的是您尝试执行的正确语法。@JamesBrown-非常好的信息和命令,先生,谢谢您分享。
117
是否必须位于第24个字段的开头,或者它是否可以位于任何位置并仍然匹配,例如,
115117,40
是否匹配?它可以在任何位置,那么您接受的答案对您不起作用,因为第一个脚本将只查看第一个位置,而第二个脚本将在任何位置找到错误匹配。
117
是否必须位于第24个字段的开头,或者它可以是任何位置和位置仍然匹配,例如,是否应该
115117,40
match?它可以位于任何位置,那么您接受的答案对您不起作用,因为第一个脚本将只查看第一个位置,而第二个脚本将在任何位置查找错误匹配。