pipe道只读取一行input的程序的最佳方法

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

# cmd2 | cmd1 

cmd1将只取得cmd2的第一行输出,产生一行输出然后closures。 我知道我可以使用像Perl这样的解释器来完成这个工作,但是我想知道是否有一个干净的方法来使用bash脚本。

谢谢

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

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

应该保留行中的空格。 ( read入的-r是进入“原始”模式以防止反斜线解释。)

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

我有一种感觉,多个cmd1可以并行运行。

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

 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

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

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

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