假设我有一个命令 cmd1 从标准输入读取一行输入并产生一行输出。我还有另一个命令 cmd2 产生多行输出。如何在 linux 中通过管道传输这两个命令,以便为 cmd2 生成的每一行执行 cmd1?如果我只是这样做:
# cmd2 | cmd1
cmd1 将仅从 cmd2 获取第一行输出,产生一行输出然后关闭。我知道我可以使用像 perl 这样的解释器来完成这项工作,但我想知道是否有一种干净的方法可以只使用 bash 脚本来完成这项工作。
谢谢
你可以使用这样的while
循环:
#! /bin/bash
IFS=$'\n'
while read -r line ; do
echo "$line" | cmd1
done < <(cmd2)
应保留行中的空格。(其中-r
是read
进入“原始”模式以防止反斜杠解释。)
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 ) }'