假设我有一个命令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/,你可以这样做:
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 ) }'