2

我有一个strings.txt包含 100 个字符串的文件,每个字符串占一行

string1
string2
...
string100

对于这些字符串中的每一个,我想找到file_to_look.txt其中包含该字符串的所有行。现在,我可以像, then等一样运行grep100 次,但这对我来说会花费很多打字时间。grep string1 file_to_look.txtgrep string2 file_to_look.txt

有没有办法让我不用打那么多字?

编辑:只经历file_to_look.txt1 次而不是 100 次的解决方案会很棒,因为我file_to_look.txt的很大。

4

5 回答 5

4

-f用于传递(GNU)grep 模式文件。

grep -f strings.txt file_to_look.txt
于 2012-11-06T22:27:42.390 回答
0
while read line; do grep "$line" file_to_look.txt; done < strings.txt

这正是你所要求的。代替 ”;” 您认为合适的换行符。

xargs 是人们会建议的另一个选项。我的建议是通常首先寻找另一种选择,因为 xarg 有很多陷阱,可能会使事情变得非常错误。

Greg 在 xargs 上的 bash wiki

于 2012-11-06T22:20:44.437 回答
0

通常 xargs 用于重复具有多个值的命令:

xargs -I{} grep {} file_to_look.txt < strings.txt
于 2012-11-06T22:22:40.963 回答
0

您可以使用 来执行此操作while read,如下所示:

cat strings.txt | while read line ; do grep "$line" file_to_look.txt ; done

有关更多替代方法,请查看:

于 2012-11-06T22:24:40.093 回答
0

您可以使用以下简短脚本执行此操作:

#!/bin/bash

file_name=string.txt
file_to_look=file_to_look.txt
patterns=$(tr '\n' '|' $filename)
patterns=${patterns%?} # remove the last |
grep -E $patterns $file_to_look

这会将您的所有搜索模式汇总在一起,并grep使用该-E选项一次性将其交给,因此grep只需解析file_to_look.txt一次,而不是 100 次。

于 2012-11-06T22:32:47.120 回答