我想从一个命令为多个参数中的每个输出传递给第二个命令,例如:
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
我想从一个命令为多个参数中的每个输出传递给第二个命令,例如:
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
您可以使用xargs
:
grep 'pattern' input | xargs -I% cp "%" "%.bac"
您可以使用$()
内插一个命令的输出。 所以,你可以使用kill -9 $(grep -hP '^\d+$' $(ls -lad /dir/*/pid | grep -P '/dir/\d+/pid' | awk '{ print $9 }'))
如果你想。
除了克里斯小丑,年轻很好的答案 ,我会说, 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
为了完整起见,我还会提到命令替换,并解释为什么不建议这样做:
cp $(grep -l "pattern" input) directory/
(倒引号语法cp `grep -l "pattern" input` directory/
大致相当于,但它是过时的和笨重;不使用)
如果从输出这将失败grep
产生包含空格或shell元字符的文件名。
当然,它的优良使用这个,如果你确切地知道哪些文件名grep
都能生产,并且已经证实,他们都不是问题。 但是,对于一个生产脚本, 不要用这个。
总之,对于OP的情况下,你需要参考每场比赛单独和扩展添加到它时, xargs
或while 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
如果必要的话,而不是多次。