2

標準入力から1行の入力を読み取り、1行の出力を生成するコマンドcmd1があるとします。複数行の出力を生成する別のコマンドcmd2もあります。Linuxでこれら2つのコマンドをパイプ処理して、cmd2によって生成された各行に対してcmd1が実行されるようにするにはどうすればよいですか?私が単純に行う場合:

# cmd2 | cmd1

cmd1は、cmd2からの出力の最初の行のみを取得し、1行の出力を生成してから、閉じます。私はperlのようなインタプリタを使って仕事をすることができることを知っていますが、bashスクリプトだけを使ってそれを行うためのクリーンな方法があるのではないかと思います。

ありがとう

4

4 に答える 4

7

while次のようなループを使用できます。

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

行内の空白を保持する必要があります。( -rinreadは、バックスラッシュの解釈を防ぐために「生」モードにすることです。)

于 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 に答える