从文件开头开始查找(grep -f)

3
我使用 commands | grep -f - file 从文件中提取管道内容。
但是我只想提取如果匹配的字符串在行的开头。通常我使用 grep '^string',但它无法与 grep -f 一起使用。
grep -f '^-' file
grep: ^-: No such file or directory

如何同时使用 grep -f -grep '^' 呢?

相关链接:https://dev59.com/zGTWa4cB1Zd3GeqPDXO0 - user000001
-f 参数的参数值是一个包含模式的文件(如果不确定,请查看 man grep)。 - doubleDown
“-f”是从https://dev59.com/nHRC5IYBdhLWcg3wAcXU#437516找到的解决方案,我喜欢它简单易用的方式。 - pogibas
1个回答

4

grep -f命令用于在文件中搜索模式。

您不能调用grep -f '^-',因为它不会将'^-'作为模式,而是作为文件名。

如果您不想使用文件,则可以使用管道。

grep -f -,其中-表示接受stdin /管道而不是文件。

这里是一个例子

echo ^a | grep -f - file.txtgrep '^a' file.txt相同。

更好的用法是只从某个文件中获取一些模式,并将这些模式用于您的文件。

grep '^PAT' patterns.txt | grep -f - myfile

这将从以PAT开头的patterns.txt文件中获取所有模式,并使用来自下一个grep的这些模式来搜索myfile。

因此,您可以在patterns.txt文件中拥有字典,并将其用于在myfile文件中进行搜索。

如果您拥有某种字典(由换行符分隔的文件中的字符串列表)并且想要将其用作包含行开头的模式,并且您没有字典中的^,则可以使用sed。

grep '^abc' dict.txt | sed 's/^/^/g' | grep -f - myfile

因此,给定dict.txt文件

a
abc
abcd
fbdf

首先,grep会选取"abc"和"abcd",并在它们前面加上^

然后执行类似于grep -e '^abc' -e '^abcd' myfile的命令。

请注意,^abcd^abc的子集。因此,在字符串末尾可能需要添加一个空格(或其他分隔符)。

grep '^abc' dict.txt | sed 's/^/^/;s/$/\ /' | grep -f - myfile


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接