2016-04-28 12 views
-2

入力ファイルinput.txtがあり、input.txtから2つの値を読み取るコマンドを実行します。 input.txtに基づいて何千回も反復されるように、入力名と出力先名を入力と同じコマンドから読み取る必要があると仮定します。コマンドを複数回実行するシェルスクリプト

また、それぞれのコマンドの出力は、別々のログに格納されます。これは単一の入力ファイルで可能ですか?ソースと出力先に2つのファイルを使用する必要がありますか?私がシェルスクリプトで貧弱なので、これを達成するために使用するシェルスクリプトを提供するように依頼してください。私は動作していない以下を試してみました。

while read i j; do 
    command $i $j 
done > output.txt 

答えて

1

確かに。これはinput.txtであると仮定します。

source1.txt dest1.txt 
source2.txt dest2.txt 
... 

そして、あなたはこれをしたい:

while read i o; do 
    command $i $o 
done < input.txt 

これは、それが最初だからコマンドcommandを既に読んするように構成されていることを前提としています。ここ

command source1.txt dest1.txt 
command source2.txt dest2.txt 
... 

は方法です引数を指定して、その2番目の引数に書き込みます。代わりに commandがstdout(端末画面)に出力された場合は、 command $i $ocommand $i > $oに置き換えてください。これはまた、 input.txtにスペースや面白い文字がないことを前提としています。

input.txtには、たとえば、

awk '{printf "command %s\n", $0}' input.txt | sh 

それとも、あなたはcommand $i > $o使用する必要がある場合:

awk '{printf "command %s > %s\n", $1, $2}' input.txt | sh 

この方法は、第二のために最初の行、command source2.txt dest2.txtためINPUT.TXTや印刷物command source1.txt dest1.txtから行を読み込み、などをライン以上の何百万人...そして、それらを実行するshへのそれらのコマンドを "パイプ"します(|)。 commandのエラー処理については

、試してみてください。

while read i o; do 
    command $i $o || command2 $i $o >> command2.log 
done < input.txt 2> error.log 

または:

done <input.txt> error.log 2>&1 

を(これらのうちの一つが標準出力に自分のエラーを印刷commandかとcommand2に応じて、より良い動作します(1)またはstderr(2)を使用します。)

+0

ありがとうWebb、私はそれを試してみました。私はいくつかのコマンドで失敗しました。結果を確認できる方法はありますか?失敗した場合は、コマンド自体を少し修正して実行する必要があります。また、すべてのコマンドが実行されると、ログの詳細がログファイルにロードされます。読んでいる間は以下のようにi o; コマンドを実行します$ I $ O \t結果(良い) \t次の反復他 \t \t command2の$ I $ Oが< input.txt >出力log.txtという – Hemanth

+0

要求されます追加のエラー処理を行っている場合 – webb

0

は、あなたが別のファイルに異なる出力をしたいと言う、コマンドごとのログファイルと1つのコマンドにつき1つのエラーファイルに:

while read i o; do 
    command $i $o 2>"$i$o.err" >"$i$o.log" 
done < input.txt 

エラーと同じファイルにログ:stderr2>&1からstdoutおかげにリダイレクトされます。

while read i o; do 
    command $i $o 2>&1 >"$i$o.log" 
done < input.txt 

また、同じファイルoutput.logにすべてを持つことができます。

echo "" > output.log 
while read i o; do 
    command $i $o 2>&1 >> output.log 
done < input.txt 
関連する問題