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语句,我可以将它放入命令中,它的处理速度非常快。