检查文件是否包含多个模式

时间:2016-05-30 10:29:13

标签: regex unix awk sed grep

我想知道如果条件为真,如何grep来自文件的多个建议。

实施例

file.txt包含

AA
BB
CC
DD

如果我做一个grep AA&来自file.txt的ZZ。它不应该提供任何输出,因为它没有ZZ模式。它应该满足这两个条件。 awk或sed什么都没关系

3 个答案:

答案 0 :(得分:2)

使用:

grep -vf <(grep -f patterns_file file) patterns_file

如果要交叉检查文件是否包含所有给定的模式,可以使用以下方法:

  • 将模式存储在不同的文件中,一个在不同的行中。

  • grep针对此模式文件的原始文件。

  • 最后,grep这个结果针对模式文件,带有倒置标志。这样,所有剩余的模式都将显示出来。如果结果为空,则表示找到了所有内容。

包含数据的文件:

$ cat data
AA
BB
CC
DD

带有模式的文件:

$ cat pat 
AA
CC
TT

检查data

中的匹配项
$ grep -f pat data
AA
CC

检查是否有任何模式仍未发现:

$ grep -vf <(grep -f pat data) pat
TT

答案 1 :(得分:1)

你会想要这样的东西:

awk '/AA/{f=a=1} /ZZ/{f=z=1} f{hits=hits $0 ORS; f=0} END{if (a && z) printf "%s", hits}'

处理AA和/或ZZ出现多次的情况,可能相互交错,例如:

$ cat file
a
AA
b
AA
c
ZZ
d
AA
e
ZZ
f

$ awk '/AA/{f=a=1} /ZZ/{f=z=1} f{hits=hits $0 ORS; f=0} END{if (a && z) printf "%s", hits}' file
AA
AA
ZZ
AA
ZZ

在文件中找到任意数量的正则表达式的一般解决方案,btw,将是:

$ cat tst.awk
BEGIN {
    split(tgts,tmp)
    for (idx in tmp) {
        wanted[tmp[idx]]
    }
}
{
    found = 0
    for (regexp in wanted) {
        if ($0 ~ regexp) {
            found = 1
            seen[regexp]
        }
    }
}
found {
    hits = hits $0 ORS
}
END {
    if ( length(wanted) == length(seen) ) {
        printf "%s", hits
    }
}

$ awk -v tgts="AA ZZ" -f tst.awk file
AA
AA
ZZ
AA
ZZ

字符串而不是正则表达式匹配将是:

    for (string in wanted) {
        if (index($0,string) {
            found = 1
            seen[string]
        }
    }

答案 2 :(得分:0)

为什么不用

进行搜索
grep -e pattern1 -e pattern2 ... file