2017-07-21 5 views
-2

私のシェル用のファイルを入力として提供しようとしていますが、そのファイルに特定の単語が含まれているかどうかをテストし、実行するコマンドを決定する必要があります。私は間違いがどこにあるのかまだ分かりません。私が書いたシェルスクリプトを見つけてください:キーワードに応じてbashコマンドを実行します。

#!/bin/(shell) 

input_file="$1" 

output_file="$2" 

grep "X-G303" | awk -f ./mno/script.awk $input_file > t1.json 

grep "x-g301" | sh ./mno/tm.sh $input_file > t2.json 

ときI入力期待通りにawkのすべてが実行されます使用していますが、2番目のコマンドのために、私も、出力ファイルを得ることはありませんファイル。どんな助けもありがとうございます。 乾杯、

+0

あなたの 'grep'コマンドはファイルに渡されないので、' grep'が 'stdin'を処理するので、これらのコマンドは無期限にブロックされます。また、 '|'は "or"コマンドではなく、左側のコマンドのouptutを右側のコマンドの入力に送るパイプです。実際に使用しているシェルを表示すると便利でしょう'bash'タグはおそらく良い手がかりですが、'(shell) 'の代わりに –

+0

それに気付きました。私はそれを修正し、それは働いている! –

答えて

1

これはあなたの質問には指定されていませんが、キーワードを含むファイルがあると思います。ファイルcmdfileにはx-g301が含まれています。そして、あなたのようなスクリプトを実行します。その場合は

./script "input_file" "output_file" < cmdfile 

、第一のパターンを検索しながら最初のgrepコマンドはstdinの全体cmdfileを消費し、そして何も二grep放置されません。そのため、2番目のgrepと2番目のスクリプトは出力を生成しません。

これを修正する方法はたくさんありますが、正しいものを選択するかどうかは、正確に何をしようとしているのかによって異なります。どうすればcmdfileのように見えますか?

./script "input_file" "output_file" "cmdfile" 

をそして、あなたのスクリプトは、このようにそれを扱うあります:それはちょうど、コマンドパターン以外のものとの大きなファイルだと仮定すると、あなたはこのように、スクリプトに3番目の引数としてそのファイルを渡すことができ

#!/bin/bash 

input_file="$1" 
output_file="$2" 
cmdfile="$3" 

if grep -q "X-G303" "$cmdfile"; then 
    awk -f ./mno/script.awk "$input_file" > t1.json 
fi 

if grep -q "x-g301" "$cmdfile"; then 
    sh ./mno/tm.sh "$input_file" > t2.json 
fi 

awkshスクリプトでは、入力ファイルの名前を指定しているので、grepからの出力は実際には必要ないと仮定しています。

grepを存在検索に使用する正しい方法は、終了コード(およびミュートされた出力は-q)です。 ifの代わりにショートサーキット(grep ... && awk ...)を使用していた可能性がありますが、この方法はおそらく読みやすくなります。

+0

宣言してくれてありがとう。実行しようとしているcmdfileを見てください。 –

+0

ありがとう、私はソースファイルを指定せずにgrepを実行したことに気付きました。すべてがうまくいきます。 –

+0

あなたは大歓迎です、うれしいです! – randomir

関連する問題