Linux 用管道传输只读取一行输入的程序的最佳方法

Linux 用管道传输只读取一行输入的程序的最佳方法,linux,bash,Linux,Bash,假设我有一个命令cmd1,它从标准输入读取一行输入并生成一行输出。我还有另一个命令cmd2,它生成多行输出。如何在linux中通过管道传输这两个命令,以便对cmd2生成的每一行执行cmd1?如果我只是这样做: # cmd2 | cmd1 cmd1将仅从cmd2获取第一行输出,生成一行输出,然后关闭。我知道我可以使用像perl这样的解释器来完成这项工作,但我想知道是否有一种干净的方法可以只使用bash脚本来完成这项工作 谢谢您可以在这样的循环中使用: #! /bin/bash IFS=$'\n'

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

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


谢谢

您可以在这样的循环中使用

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

完成<我感觉多个
cmd1
可以并行运行

如果已安装GNU并行,则可以执行以下操作:

cmd2 | parallel --pipe -N1 cmd1
您可以通过以下方式安装GNU并行:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem
观看GNU Parallel的介绍视频,了解更多信息:

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

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

除了发布的足够的while循环之外,我建议您查看xargs和/或gnupallel,因为它将在您提供更多选项(例如在中运行cmd1)的同时完成同样的任务parallel@frankc,如果
cmd1
采用命令行参数,则xargs将非常有用,但正如它从stdin
读到的,而read
可能是最简单的解决方案。@glenn当然你是对的。我不是真的在想Hanks@glenn。(IFS阻止了分词,但没有考虑过全球化…)对,我错过了IFS。好电话。
cmd2 | awk '{ system( "echo " $1 " | cmd1" ) }'
find /var/www/html/ -name .htaccess | awk '{ system( "ls -lA " $1 ) }'