如何将shell命令应用于命令输出的每一行?

时间:2010-04-26 03:31:31

标签: bash

假设我有一些命令的输出(例如ls -1):

a
b
c
d
e
...

我想依次对每个命令应用一个命令(比如说echo)。 E.g。

echo a
echo b
echo c
echo d
echo e
...

在bash中最简单的方法是什么?

9 个答案:

答案 0 :(得分:181)

使用xargs可能最简单。在你的情况下:

ls -1 | xargs -L1 echo

答案 1 :(得分:132)

您可以在每一行使用基本的前置操作:

ls -1 | while read line ; do echo $line ; done

或者您可以将输出传递给sed以进行更复杂的操作:

ls -1 | sed 's/^\(.*\)$/echo \1/'

答案 2 :(得分:8)

您可以使用for loop

for file in * ; do
   echo "$file"
done

请注意,如果有问题的命令接受多个参数,那么使用xargs几乎总是更有效率,因为它只需要生成一次有问题的实用程序而不是多次。

答案 3 :(得分:8)

你实际上可以使用sed来做它,只要它是GNU sed。

... | sed 's/match/command \0/e'

工作原理:

  1. 用命令匹配替换匹配
  2. 替换执行命令
  3. 用命令输出替换替换行。

答案 4 :(得分:3)

for s in `cmd`; do echo $s; done

如果cmd的输出很大:

cmd | xargs -L1 echo

答案 5 :(得分:2)

xargs失败并带有反斜杠,引号。它需要像

ls -1 |tr \\n \\0 |xargs -0 -iTHIS echo "THIS is a file."

xargs -0选项:

-0, --null
          Input  items are terminated by a null character instead of by whitespace, and the quotes and backslash are
          not special (every character is taken literally).  Disables the end of file string, which is treated  like
          any  other argument.  Useful when input items might contain white space, quote marks, or backslashes.  The
          GNU find -print0 option produces input suitable for this mode.

ls -1使用换行符终止项目,因此tr会将它们转换为空字符。

这种方法比用for ...手动迭代慢约50倍(参见 Michael Aaron Safyan 的回答)(3.55s vs. 0.066s)。但对于其他输入命令,如定位,查找,从文件(tr \\n \\0 <file)或类似文件中读取,您必须使用xargs这样的。{/ p>

答案 6 :(得分:1)

对我来说更好的结果:

ls -1 | xargs -L1 -d "\n" CMD

答案 7 :(得分:0)

例如,我喜欢使用gawk在列表上运行多个命令

ls -l | gawk '{system("/path/to/cmd.sh "$1)}'

但是,可转义字符的转义会有点毛茸茸。

答案 8 :(得分:0)

使用包含空格的文件名的解决方案是:

ls -1 | xargs -I %s echo %s

以下内容是等效的,但在前体和您实际想要做的事情之间有更清晰的区别:

ls -1 | xargs -I %s -- echo %s

其中 echo 是您要运行的任何内容,后面的 %s 是文件名。

感谢 Chris Jester-Younganswer 上的 duplicate question