我想知道如果条件为真,如何grep
来自文件的多个建议。
实施例
file.txt包含
AA
BB
CC
DD
如果我做一个grep AA&来自file.txt的ZZ。它不应该提供任何输出,因为它没有ZZ模式。它应该满足这两个条件。 awk或sed什么都没关系
答案 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