管道只读取一行输入的程序的最佳方法

时间:2012-05-04 18:17:31

标签: linux bash

假设我有一个命令cmd1,它从标准输入读取一行输入并产生一行输出。我还有另一个命令cmd2,它产生多行输出。如何在linux中管理这两个命令,以便为cmd2生成的每一行执行cmd1?如果我只是这样做:

# cmd2 | cmd1

cmd1只接受cmd2的第一行输出,产生一行输出然后关闭。我知道我可以使用像perl这样的解释器来完成这项工作,但我想知道是否有一种干净的方法只能使用bash脚本。

由于

4 个答案:

答案 0 :(得分:7)

您可以像这样使用while循环:

#! /bin/bash
IFS=$'\n'
while read -r line ; do
    echo "$line" | cmd1
done < <(cmd2)

应保留行中的空格。 (-r中的read将进入"raw" mode以防止反斜杠解释。)

答案 1 :(得分:1)

cmd2 | while read line; do echo $line | cmd1; done

答案 2 :(得分:1)

我感觉可以并行运行多个cmd1

如果你安装了GNU Parallel http://www.gnu.org/software/parallel/,你可以这样做:

cmd2 | parallel --pipe -N1 cmd1

您可以通过以下方式安装GNU Parallel:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

观看GNU Parallel的介绍视频了解详情: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

答案 3 :(得分:0)

cmd2 | awk '{ system( "echo " $1 " | cmd1" ) }'

一个可用的示例,我在所有网站上验证.htaccess个文件的所有权/权限。

find /var/www/html/ -name .htaccess | awk '{ system( "ls -lA " $1 ) }'