我已经习惯使用grep
命令行搜索,并且想知道如何使用另一个搜索的结果成功地进行搜索。
这是我的尝试,我在结果中寻找“工具”:
grep tool | grep -rl embed=
这会返回一些结果,然后控制台挂起。有没有简单/优雅的解决方案?
答案1
管道从左向右跑。更准确地说,流程并行运行,但是数据从左到右流动:左侧命令的输出成为右侧命令的输入。
这里左边的命令是grep tool
。由于您将单个参数传递给grep
,因此它会在其标准输入中进行搜索。由于您尚未重定向标准输入,grep
因此正在从终端读取:它正在等待您键入。
要在文件中搜索,请使用
grep tool path/to/file | …
要在目录中递归搜索,请使用
grep -r tool path/to/directory | …
您可以过滤结果以仅列出包含 的行embed=
。删除-l
和-r
选项,当输入来自标准输入时它们没有任何意义。
grep -r tool path/to/directory | grep 'embed='
这列出了包含tool
和embed=
(以任一顺序)的行。另一种更简单的管道方法是使用 or 模式进行单个搜索;这总是可能的,但如果模式可以重叠(不是这里的情况),模式可能会变得非常复杂。
grep -E -r 'tool.*embed=|embed=.*tool' path/to/directory
如果你想列出文件包含tool
和embed=
,您需要不同的命令结构,第一个grep
列出文件名 ( -l
),第二个接收这些文件名作为论点,不作为输入。将标准输入转换为命令行参数xargs
命令是为了。
grep -lZ -r tool path/to/directory | xargs -0 grep -l 'embed='
答案2
foo
此命令将在文件filename
和结果中搜索bar
:
grep foo filename | grep bar
另一种选择是使用 awk:
awk '/foo/ && /bar/' filename
答案3
您可以通过不同的方式使用 grep,例如:
cat myfile | grep keyword
上面的示例将文件转储到stdout
.管道字符|
将获取该输出并将其提供给grep keyword
命令 as stdin
。最后, myfile 中包含的行将keyword
被写入stdout
,通常是终端屏幕。这是对资源的非常低效的利用,使用此命令也可以实现相同的结果:
grep keyword myfile
如果您想grep
以级联方式使用,请按以下方式操作:
grep keyword1 myfile | grep keyword2
这次,第一个命令查找myfile 中grep
包含的行。keyword1
第二个 grep 命令获取第一个命令的输出,并keyword2
在其中进行搜索。实际上,您正在寻找同时包含keyword1
和keyword2
的行myfile
。
您可以使用多个管道将这些命令与不同的命令行开关相乘,以找到您正在寻找的内容。如果您可以用简单的英语详细说明您在原始问题中尝试使用命令执行的操作,那么我自己或其他人可以进一步帮助您。
答案4
本质上你想做的是逻辑与。 grep
是一个行匹配工具,因此就行 patter1 和 patter2 逻辑而言,意味着它们将位于同一行;当您搜索文件时,您想要在同一行中查找包含一个术语和另一个术语的行,您可以使用正则表达式grep 'pattern1.*pattern2' input_file.txt
$ ps -ef | grep 'xieerqi.*firefox'
xieerqi 5069 2616 7 17:43 ? 00:07:25 /usr/lib/firefox/firefox
xieerqi 24317 6901 0 19:22 pts/19 00:00:00 grep xieerqi.*firefox
在此示例中,不是使用我的用户名搜索所有进程,然后通过管道传输到另一个grep
过滤firefox
进程。
更多内容可以参考这个教程