在搜索中搜索

dar*_*ace 3 command-line grep pipe

我已经习惯于使用grep我的命令行搜索,并想知道如何使用另一个搜索的结果成功进行搜索。

这是我的尝试,我在结果中寻找“工具”:

grep tool | grep -rl embed=
Run Code Online (Sandbox Code Playgroud)

这会返回一些结果,然后控制台挂起。是否有任何简单/优雅的解决方案?

Gil*_*il' 6

管道从左到右运行。更准确地说,进程并行运行,但数据从左到右流动:左侧命令的输出成为右侧命令的输入。

这里左边的命令是grep tool。由于您将单个参数传递给grep,因此它正在其标准输入中进行搜索。由于您尚未重定向标准输入,因此grep正在从终端读取:它正在等待您输入。

要在文件中搜索,请使用

grep tool path/to/file | …
Run Code Online (Sandbox Code Playgroud)

要递归搜索目录,请使用

grep -r tool path/to/directory | …
Run Code Online (Sandbox Code Playgroud)

您可以过滤结果以仅列出包含embed=. 删除-l-r选项,当输入来自标准输入时,它们没有意义。

grep -r tool path/to/directory | grep 'embed='
Run Code Online (Sandbox Code Playgroud)

这列出了包含toolembed=(以任一顺序)的行。另一种具有更简单管道的替代方法是使用 or 模式进行单次搜索;这总是可能的,但如果模式可以重叠(这里不是这种情况),模式会变得非常复杂。

grep -E -r 'tool.*embed=|embed=.*tool' path/to/directory
Run Code Online (Sandbox Code Playgroud)

如果您想列出包含和 的文件,您需要一个不同的命令结构,第一个列出文件名 ( ),第二个接收这些文件名作为参数,而不是作为输入。将标准输入转换为命令行参数该命令的用途。toolembed=grep-lxargs

grep -lZ -r tool path/to/directory | xargs -0 grep -l 'embed='
Run Code Online (Sandbox Code Playgroud)