- 此问题在此处已有答案**:
How to pass command output as multiple arguments to another command(5个答案)
Read expression for grep from standard input(1个答案)
8小时前关门了。
我希望了解如何使用管道将标准输出作为其他命令的参数传递。
例如,考虑以下情况:
ls | grep Hello
grep的结构遵循以下模式:grep SearchTerm PathOfFileToBeSearched
。在我所演示的示例中,单词Hello被用作SearchTerm
,ls的结果被用作要搜索的文件。但是如果我想将其转换过来呢?如果我想将ls的标准输出作为SearchTerm,而grep后面的参数为PathOfFileToBeSearched
呢?一般来说,我想控制管道中用前一个命令的标准输出填充哪个参数。这是可能的吗?还是取决于该命令的脚本(例如grep
)是如何编写的?
非常感谢你的帮助!
2条答案
按热度按时间c9qzyr3d1#
grep
本身将被构建为如果您没有指定文件名,它将打开stdin(从而获得ls
的输出)。这里没有真实的的通用机制-只是约定。如果你想把
ls
的输出作为搜索项,你可以通过shell来实现。使用一个subshell和substitution,如下所示:在这个场景中,
ls
在一个subshell中运行,它的stdout被捕获并作为grep
的参数插入到命令行中。注意,如果ls
输出包含空格,这将导致grep
的混淆。p8ekf7hl2#
基本上有两种选择:shell命令替换和
xargs
。Brian Agnew刚刚写了关于前者的文章。xargs
是一个实用程序,它接受stdin并将其转换为要执行的命令的参数。并且对于
ls
输出的每个文件,它将运行grep -e filename PathOfFileToBeSearched
以grep在您指定的另一个文件中获取ls
输出的文件名。通常,它用于在命令末尾添加一个或多个参数,而在这里,它应该在特定位置添加一个参数,因此我使用了-n
和-J
参数来安排它。来搜索
ls
输出的所有文件中是否有term
。当然,如果您只需要当前目录中的文件,您可以更简单地执行此操作,而无需使用管道:同样在你的反向排列中
有一个重要的
xargs
警告:由ls
生成的文件名中的空格字符不会得到很好的处理。要做到这一点,只要你有GNU实用程序,你可以使用find
。使用NUL字符而不是空格分隔文件名