命令参数的Unix管道[重复]

1mrurvl1  于 2023-01-13  发布在  Unix
关注(0)|答案(2)|浏览(135)
    • 此问题在此处已有答案**:

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)是如何编写的?
非常感谢你的帮助!

c9qzyr3d

c9qzyr3d1#

grep本身将被构建为如果您没有指定文件名,它将打开stdin(从而获得ls的输出)。这里没有真实的的通用机制-只是约定。
如果你想把ls的输出作为搜索项,你可以通过shell来实现。使用一个subshell和substitution,如下所示:

$ grep $(ls) filename.txt

在这个场景中,ls在一个subshell中运行,它的stdout被捕获并作为grep的参数插入到命令行中。注意,如果ls输出包含空格,这将导致grep的混淆。

p8ekf7hl

p8ekf7hl2#

基本上有两种选择:shell命令替换和xargs。Brian Agnew刚刚写了关于前者的文章。xargs是一个实用程序,它接受stdin并将其转换为要执行的命令的参数。

ls | xargs -n1 -J % grep -- % PathOfFileToBeSearched

并且对于ls输出的每个文件,它将运行grep -e filename PathOfFileToBeSearched以grep在您指定的另一个文件中获取ls输出的文件名。通常,它用于在命令末尾添加一个或多个参数,而在这里,它应该在特定位置添加一个参数,因此我使用了-n-J参数来安排它。

ls | xargs grep -- term

来搜索ls输出的所有文件中是否有term。当然,如果您只需要当前目录中的文件,您可以更简单地执行此操作,而无需使用管道:

grep -- term *

同样在你的反向排列中

for filename in *; do
  grep -- "$@" PathOfFileToBeSearched
done

有一个重要的xargs警告:由ls生成的文件名中的空格字符不会得到很好的处理。要做到这一点,只要你有GNU实用程序,你可以使用find

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 -n1 -J % grep -- % PathOfFileToBeSearched

使用NUL字符而不是空格分隔文件名

相关问题