Linux 测试文件中的每一行是否包含另一个文件中的多个字符串之一

Linux 测试文件中的每一行是否包含另一个文件中的多个字符串之一,linux,bash,grep,Linux,Bash,Grep,我有一个文本文件(我们称之为keywords.txt),其中包含许多用换行符分隔的字符串(尽管这不是一成不变的;我可以用空格、逗号或任何最合适的方式分隔它们)。我还有许多其他文本文件(我将统称为input.txt) 我要做的是遍历input.txt中的每一行,并测试该行是否包含一个关键字。之后,根据我当时正在处理的输入文件,我需要将input.txt中的匹配行复制到output.txt并忽略不匹配行,或者复制不匹配行并忽略匹配 我寻找了一个解决方案,但是,尽管我找到了一些方法来完成我正在尝试做的

我有一个文本文件(我们称之为
keywords.txt
),其中包含许多用换行符分隔的字符串(尽管这不是一成不变的;我可以用空格、逗号或任何最合适的方式分隔它们)。我还有许多其他文本文件(我将统称为
input.txt

我要做的是遍历
input.txt
中的每一行,并测试该行是否包含一个关键字。之后,根据我当时正在处理的输入文件,我需要将
input.txt
中的匹配行复制到
output.txt
并忽略不匹配行,或者复制不匹配行并忽略匹配

我寻找了一个解决方案,但是,尽管我找到了一些方法来完成我正在尝试做的部分工作,但我还没有找到一种方法来完成我在这里要求的所有事情。虽然我可以尝试并结合我发现的各种解决方案,但我主要担心的是,我最终会想,我编写的代码是否是实现这一点的最佳方式

这是我目前在
keywords.txt
中的一个片段:

google
adword
chromebook.com
cobrasearch.com
feedburner.com
doubleclick
foofle.com
froogle.com
gmail
keyhole.com
madewithcode.com
下面是我的
input.txt
文件中的一个示例:

&expandable_ad_
&forceadv=
&gerf=*&guro=
&gIncludeExternalAds=
&googleadword=
&img2_adv=
&jumpstartadformat=
&largead=
&maxads=
&pltype=adhost^

在这个代码段中,
&googleadword=
是唯一与过滤器匹配的行,在我的例子中,
output.txt
要么只插入匹配的行,要么插入与关键字不匹配的每一行。

1。假设
keywords.txt
的内容由换行符分隔:

google
adword
chromebook.com
...
google|adword|chromebook.com|...
google,adword,chromebook.com,...
以下工作将起作用:

# Use keywords.txt as your pattern & copy matching lines in input.txt to output.txt
grep -Ff keywords.txt input.txt > output.txt

# Use keywords.txt as your pattern & copy non-matching lines in input.txt to output.txt
grep -vFf keywords.txt input.txt > output.txt
# Use keywords.txt as your pattern & copy matching lines in input.txt to output.txt
grep -Ef keywords.txt input.txt > output.txt

# Use keywords.txt as your pattern & copy non-matching lines in input.txt to output.txt
grep -vEf keywords.txt input.txt > output.txt

2。假设
keywords.txt
的内容由竖条分隔:

google
adword
chromebook.com
...
google|adword|chromebook.com|...
google,adword,chromebook.com,...
以下工作将起作用:

# Use keywords.txt as your pattern & copy matching lines in input.txt to output.txt
grep -Ff keywords.txt input.txt > output.txt

# Use keywords.txt as your pattern & copy non-matching lines in input.txt to output.txt
grep -vFf keywords.txt input.txt > output.txt
# Use keywords.txt as your pattern & copy matching lines in input.txt to output.txt
grep -Ef keywords.txt input.txt > output.txt

# Use keywords.txt as your pattern & copy non-matching lines in input.txt to output.txt
grep -vEf keywords.txt input.txt > output.txt

3。假设
keywords.txt
的内容用逗号分隔:

google
adword
chromebook.com
...
google|adword|chromebook.com|...
google,adword,chromebook.com,...
实现这一点的方法有很多,但一种简单的方法是使用
tr
将所有逗号替换为竖条,然后用grep的扩展正则表达式解释模式

# Use keywords.txt as your pattern & copy matching lines in input.txt to output.txt
grep -E $(tr ',' '|' < keywords.txt) input.txt > output.txt

# Use keywords.txt as your pattern & copy non-matching lines in input.txt to output.txt
grep -vE $(tr ',' '|' < keywords.txt) input.txt > output.txt
阅读更多关于

阅读更多关于


这不就是
grep-Ff
?看看
man-grep
grep-Ff
,它看起来会起作用。我试试看会发生什么。看起来我可以使用
grep-Ffv
来复制非匹配项。请避免“给我代码”问题。而是显示您正在处理的脚本,并说明问题所在。另请参见
我搜索了一个解决方案,但是,尽管我找到了一些方法来完成我试图完成的部分工作,但我还没有找到一种方法来完成我在这里要求的所有工作。虽然我可以尝试组合我找到的各种解决方案,但我最担心的是,我最终会想,我编写的代码是否是最好的方法。
事实上,到目前为止,使用Grep的建议比组合我找到的解决方案要简单得多(例如,在问这个问题之前,我正在考虑将
keywords.txt
的内容分配给一个数组)另外,这个问题的最佳答案是充满讽刺。
我寻找了一个解决方案,但是,尽管我找到了一些方法来完成我正在尝试做的部分工作,但我还没有找到一种方法来完成我在这里要求的每件事。虽然我可以尝试将我找到的各种解决方案结合起来,但我主要担心的是,我最终会怀疑我编写的代码是否能够解决问题e这是最好的方法。
事实上,到目前为止,使用Grep的建议比结合我找到的解决方案要简单得多(例如,在问这个问题之前,我考虑的一个解决方案建议将
keywords.txt
的内容分配给一个数组)此外,如果你不想回答这类问题,这是你的选择,你有权这样做,但不要告诉其他撰稿人,他们无权以与你不一致的方式做出同样的选择。此外,你是不是否决了托比亚斯布舍尔的答案的人?如果是,这意味着你滥用了评级体系m根据政治/固执己见的原因对答案进行评级,而不是根据答案回答问题的程度。最终,我成功地测试了你的答案,这正是我想要的。谢谢!