2

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

# cmd2 | cmd1

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

谢谢

4

4 回答 4

7

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

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

应保留行中的空格。(其中-rread进入“原始”模式以防止反斜杠解释。)

于 2012-05-04T18:33:46.057 回答
1
cmd2 | while read line; do echo $line | cmd1; done
于 2012-05-04T18:32:13.620 回答
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

于 2012-05-09T21:31:58.177 回答
0
cmd2 | awk '{ system( "echo " $1 " | cmd1" ) }'

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

find /var/www/html/ -name .htaccess | awk '{ system( "ls -lA " $1 ) }'
于 2013-07-07T08:56:33.077 回答