我有这个grep
命令输出文件的名称(包含与某些模式的匹配),我想用一些文件解析程序解析这些文件。 pipechain看起来像这样:
grep -rl "{some-pattern}" . | {some-file-parsing-program} > a.out
如何将这些文件名作为文件解析程序的命令行参数?
例如,假设grep
返回文件名a
,b
,c
。如何传递文件名,使其好像我正在执行
{some-file-parsing-program} a b c > a.out
答案 0 :(得分:9)
在我看来,好像你想要xargs
:
grep -rl "{some_pattern" . | xargs your-command > a.out
我不相信a.out
是一个很好的输出文件名,但我们可以让它滑动。 xargs
命令从标准输入读取空格分隔的文件名,然后使用这些名称作为参数调用your-command
。它可能需要多次调用your-command
;除非您使用GNU xargs
并指定-r
,否则your-command
将被调用至少一次,即使没有匹配的文件名。
不使用xargs
,您无法将sed
用于此作业。不使用xargs
,使用awk
会很笨拙。 Perl(和Python)可以“平凡地”管理它;编写代码以从标准输入读取文件名然后依次处理每个文件会很容易。
答案 1 :(得分:0)
我不知道任何无法从stdin读取的linux程序。根据程序的不同,默认输入可能是stdin,或者您可能需要通过使用命令行选项指定使用stdin(通常单独使用-
)。你有什么特别的想法吗?