管道输出用作Linux上grep的搜索规范

27 linux grep

如何管理grep的输出作为另一个grep的搜索模式?

举个例子:

grep <Search_term> <file1> | xargs grep <file2>
Run Code Online (Sandbox Code Playgroud)

我希望第一个grep的输出作为第二个grep的搜索项.上面的命令将第一个grep的输出视为第二个grep的文件名.我尝试使用-e第二个grep 的选项,但它也不起作用.

Nat*_*man 14

你需要使用xargs-i开关:

grep ... | xargs -ifoo grep foo file_in_which_to_search
Run Code Online (Sandbox Code Playgroud)

这将采用-i(foo在这种情况下)之后的选项,并将命令中的每个匹配项替换为第一个输出grep.

这与:

grep `grep ...` file_in_which_to_search
Run Code Online (Sandbox Code Playgroud)

  • xargs replstr 选项在 OS X 上使用大写 -I (2认同)

Pau*_*lin 12

尝试

grep ... | fgrep -f - file1 file2 ...
Run Code Online (Sandbox Code Playgroud)

  • @Nathan,它使用第一个grep的输出作为fgrep模式的输入文件."-f - "是告诉unix程序使用标准输入作为输入文件的常规方法,如果它通常需要输入文件.传统上fgrep是唯一一个将文件作为输入的grep,尽管Gnu可能已经修改了其他greps. (3认同)

Aln*_*tak 8

如果使用Bash,那么你可以使用反引号:

> grep -e "`grep ... ...`" files
Run Code Online (Sandbox Code Playgroud)

-e标志和双引号在那里,以确保从初始任何输出grep与一个连字符开始不然后解释为一个选项,以第二grep.

请注意,双引号技巧(也确保将grep的输出视为单个参数)仅适用于Bash.它似乎不适用于(t)csh.

另请注意,反引号是将一个程序的输出转换为另一个程序的参数列表的标准方法.并非所有程序都以(f)grep的方式从stdin读取参数的方便方法.

  • 如果第一个 grep 返回多个结果,这个可能会有问题。 (2认同)

mcv*_*cvz 5

我想在当前目录中的文件名(使用 find 找到)中有特定模式的文件(使用 grep)中搜索文本。我使用了以下命令:

 grep -i "pattern1" $(find . -name "pattern2")
Run Code Online (Sandbox Code Playgroud)

这里模式2是在文件名中的模式,模式1是模式搜索中的文件匹配模式2

编辑:不是严格的管道,但仍然相关且非常有用......