Parsing 使用'列出不匹配的条目;grep-f';

Parsing 使用'列出不匹配的条目;grep-f';,parsing,if-statement,grep,Parsing,If Statement,Grep,以下命令提供了匹配表达式的列表: grep-f/tmp/list Filename*>/tmp/output 然后解析列表文件,并用于搜索文件名*,查找解析后的字符串。然后将结果保存到输出 如果文件名*中没有匹配项,如何从列表中输出解析后的字符串 列表文件的内容可以是: ABC BLA ZZZ HJK Filename1:5,ABC,123 Filename2:5,ZZZ,342 BLA HJK 示例文件: ABC BLA ZZZ HJK Filename1:5,ABC,123 File

以下命令提供了匹配表达式的列表:

grep-f/tmp/list Filename*>/tmp/output

然后解析
列表
文件,并用于搜索
文件名*
,查找解析后的字符串。然后将结果保存到
输出

如果文件名*中没有匹配项,如何从
列表中输出解析后的字符串

列表
文件的内容可以是:

ABC
BLA
ZZZ
HJK
Filename1:5,ABC,123
Filename2:5,ZZZ,342
BLA
HJK
示例文件:

ABC
BLA
ZZZ
HJK
Filename1:5,ABC,123
Filename2:5,ZZZ,342
BLA
HJK
运行命令的结果:

ABC
BLA
ZZZ
HJK
Filename1:5,ABC,123
Filename2:5,ZZZ,342
BLA
HJK
通过使用if语句,堆栈溢出问题看起来可能是相关的。但是,我不确定如何将解析后的字符串输出到输出文件。需要某种类型的读取行吗

蒂亚

话筒

这使得:

$ grep -v "$(cat Filename* | cut -d, -f2)" /tmp/list
BLA
HJK
解释
然后
grep-v
查找反向匹配。

显然,
grep-f list Filename*
给出了
Filename*
指定的文件中文件
list
中模式的所有匹配,即

Filename1:5,ABC,123
Filename2:5,ZZZ,342
在你的例子中

通过添加
-o
(仅打印匹配表达式)和
-h
(不打印文件名)标志,我们可以将其转换为:

ABC
ZZZ
现在,您需要
list
中未包含在此列表中的所有模式,这可以通过

grep -f list Filename* -o -h | grep -f /dev/stdin -v list

其中第二个
grep
从第一个的输出中获取其模式,并使用
-v
标志给出与这些模式不匹配的所有文件
列表行。

我尝试了该命令,但无法使其工作,可能是我做错了什么。我有一个额外的grep语句,它在文件中搜索第二个参数(问题中没有涉及这一点)。我不确定/dev/stdin的用途。
-f/dev/stdin
非常重要,它使第二个
grep
从标准输入读取其搜索模式(这是第一个
grep
的输出)。如果您想用您提到的额外grep语句编辑OP,我可以相应地编辑我的答案。尽管要解释重复的答案,你应该把最后的
-v
转换成
-vxF
。你基本上是在做一套补/减法:这很有效。我有第二个grep语句,我可以将它放入命令中,它的处理速度非常快。