代码之家  ›  专栏  ›  技术社区  ›  Alex Budovski

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

  •  152
  • Alex Budovski  · 技术社区  · 14 年前

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

    a
    b
    c
    d
    e
    ...
    

    我想申请一个命令 echo )依次对每一个人。例如。

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

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

    8 回复  |  直到 6 年前
        1
  •  175
  •   Michael Mrozek    14 年前

    它可能是最容易使用的 xargs . 就你而言:

    ls -1 | xargs -L1 echo
    
        2
  •  126
  •   AdrienBrault    11 年前

    您可以在每一行上使用基本的prepend操作:

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

    或者,您可以将输出管道传输到sed以执行更复杂的操作:

    ls -1 | sed 's/^\(.*\)$/echo \1/'
    
        3
  •  8
  •   Michael Aaron Safyan    14 年前

    你可以用 for loop :

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

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

        4
  •  7
  •   Łukasz Daniluk    10 年前

    实际上你 可以 使用sed来完成它,前提是它是gnu sed。

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

    工作原理:

    1. 用命令匹配替换匹配
    2. 论替代 执行命令
    3. 用命令输出替换替换行。
        5
  •  3
  •   Marcelo Cantos    14 年前
    for s in `cmd`; do echo $s; done
    

    如果CMD的输出很大:

    cmd | xargs -L1 echo
    
        6
  •  2
  •   phil294    7 年前

    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 ... (见 迈克尔·亚伦·萨菲 回答)(3.55秒对0.066秒)。但对于其他输入命令,如定位、查找、读取文件( tr \\n \\0 <file )或者类似的,你必须和 xargs 这样地。

        7
  •  1
  •   Andrej Pandovich    10 年前

    对我来说更好的结果是:

    ls -1 | xargs -L1 -d "\n" CMD
    
        8
  •  0
  •   Chris    6 年前

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

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

    不过,逃逸角色的逃逸可能会有点毛茸茸的。