使用grep从同一行中的选项列表中返回两个实例

时间:2016-10-31 10:03:14

标签: bash grep

我有一些格式为

的数据
abc,def

其中abc和def是相互链接的域名。

我有一个我感兴趣的域名列表(abc,def和ghi),需要查找列表中任何两个一起提到的实例。那是回归:

abc,def
def,abc
abc,ghi
...

但不是

abc,xyz

我还需要回复:

abc,abc  
def,def (which do occur)

我尝试使用:

grep -e 'abc\|def\|ghi' filename.csv | grep -e 'abc\|def\|ghi'

但这失败了,大概是因为我犯了一些逻辑荒谬,但我看不出它是什么。

我正在编写一个.sh脚本,用于Gitbash for Windows。

2 个答案:

答案 0 :(得分:1)

我认为像

这样的东西
grep -E "([,]?(abc|def|ghi)){2}"

应该有效。你可以扩展[,]来覆盖你周围的空白或任何其他垃圾。

此行将查找括号内提到的2个事件,这是之前的可选逗号,然后是您感兴趣的关键字列表之一。

答案 1 :(得分:0)

这里的关键是存储您想要在列中查看的名称,然后检查所有列是否与其中任何列匹配:

awk -F, -v patt="abc def ghi" 
    'BEGIN {
        split(patt,names," ");                    # store data in array
        for (i in names) n[names[i]]=names[i]     # store in indexes
     } 
     ($1 in n) && ($2 in n) ' file                # check if present

看到它的实际效果:

$ cat a
abc,def
def,abc
abc,ghi
abc,abc
abc,xyz
xyz,123
$ awk -F, -v patt="abc def ghi" 'BEGIN {split(patt,names," "); for (i in names) n[names[i]]=names[i]} ($1 in n) && ($2 in n) ' a
abc,def
def,abc
abc,ghi
abc,abc