【问题标题】:grep from the beginning of a file (grep -f )从文件开头 grep (grep -f )
【发布时间】:2013-06-09 12:13:35
【问题描述】:

我使用commands | grep -f - file 从文件中提取管道内容。
但是,我只想在匹配字符串位于行首时提取。通常我使用grep '^string',但它不适用于grep -f

grep -f '^-' file
grep: ^-: No such file or directory

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

【问题讨论】:

标签: bash grep


【解决方案1】:

grep -f 用于包含模式的文件。

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

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

grep -f -,其中- 是获取标准输入/管道而不是文件的信号。

这是一个例子

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

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

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

这将从文件 patterns.txt 中获取以 PAT 开头的所有模式,并使用下一个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 2023-02-20
    • 1970-01-01
    相关资源
    最近更新 更多