如何通过命令的输出作为多个另一个命令的参数如何通过命令的输出作为多个另一个命令的参数(How to

2019-05-10 22:24发布

我想从一个命令为多个参数中的每个输出传递给第二个命令,例如:

grep "pattern" input

收益:

file1
file2
file3

我想复制这些成果,例如:

cp file1  file1.bac
cp file2  file2.bac
cp file3  file3.bac

我该怎么做,在一个去了? 就像是:

grep "pattern" input | cp $1  $1.bac

Answer 1:

您可以使用xargs

grep 'pattern' input | xargs -I% cp "%" "%.bac"


Answer 2:

您可以使用$()内插一个命令的输出。 所以,你可以使用kill -9 $(grep -hP '^\d+$' $(ls -lad /dir/*/pid | grep -P '/dir/\d+/pid' | awk '{ print $9 }'))如果你想。



Answer 3:

除了克里斯小丑,年轻很好的答案 ,我会说, xargs也是这些情况很好的解决方案:

grep ... `ls -lad ... | awk '{ print $9 }'` | xargs kill -9

会做到。 全部一起:

grep -hP '^\d+$' `ls -lad /dir/*/pid | grep -P '/dir/\d+/pid' | awk '{ print $9 }'` | xargs kill -9


Answer 4:

为了完整起见,我还会提到命令替换,并解释为什么不建议这样做:

cp $(grep -l "pattern" input) directory/

(倒引号语法cp `grep -l "pattern" input` directory/大致相当于,但它是过时的和笨重;不使用)

如果从输出这将失败grep产生包含空格或shell元字符的文件名。

当然,它的优良使用这个,如果你确切地知道哪些文件名grep都能生产,并且已经证实,他们都不是问题。 但是,对于一个生产脚本, 不要用这个。

总之,对于OP的情况下,你需要参考每场比赛单独和扩展添加到它时, xargswhile read的替代优于反正。

在最坏的情况下(意味着问题的或未指定的文件名),通过匹配经由子shell xargs

grep -l "pattern" input |
xargs -r sh -c 'for f; do cp "$f" "$f.bac"; done' _

...其中显然里面的脚本for循环可以是任意复杂的。

在理想情况下,你要运行的命令很简单(或通用的)不够,你可以简单地传递一个任意长文件名的列表。 例如,GNU cp有一个-t选项,以促进这一使用xargs (在-t选项允许你先把目标目录中的命令行上,这样你就可以在命令结束把尽可能多的文件,只要你喜欢):

grep -l "pattern" input | xargs cp -t destdir

这将扩大到

cp -t destdir file1 file2 file3 file4 ...

如尽可能多的比赛xargs可以适合于命令行cp ,重复多次,因为它需要的所有文件传递给cp 。 (不幸的是,这并不符合OP的情况下,如果你需要在复制时,你需要在每个只有两个参数传递给每一个文件重命名cp调用:源文件名和目标文件名复制到。)

因此,换句话说,如果你使用的命令替换语法和grep产生长的比赛名单,你就有可能撞到ARG_MAX和“参数列表太长”的错误; 但xargs进行具体而不是照搬只能作为很多争论,因为它可以安全地通过避免这种cp的时间,并运行cp如果必要的话,而不是多次。



文章来源: How to pass command output as multiple arguments to another command
标签: linux shell unix