假设我有一个命令cmd1,它从标准输入读取一行输入并产生一行输出。我还有另一个命令cmd2,它产生多行输出。如何在linux中管理这两个命令,以便为cmd2生成的每一行执行cmd1?如果我只是这样做:
# cmd2 | cmd1
cmd1只接受cmd2的第一行输出,产生一行输出然后关闭。我知道我可以使用像perl这样的解释器来完成这项工作,但我想知道是否有一种干净的方法只能使用bash脚本。
由于
答案 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 ) }'