2017-07-09 35 views
-1

grepを使用して入力行に特定のパターンが含まれているかどうかを調べるbashスクリプトセグメントがあります。文字列にawkの部分文字列が含まれているかどうかを調べる方法

echo $input_line | grep -q "$pattern" 
if [ $? -eq 0 ]; 
then 
    # Input line contains pattern 
    # Execute some bash commands 
else 
    # Input line DOES NOT contain pattern 
    # Execute other bash commands 
fi 

grepのないawkで書き直す必要があります。私はいくつかの変種を試しましたが、それらのどれもうまくいきません。たとえば、以下の両方の場合、常にMATCHが表示されます。 入力行パターンが含まれているかどうかは関係ありません。

echo $input_line | awk -v b="$pattern" '/pattern/ { print "MATCH" }' 

echo $input_line | awk -v b="$pattern" '/$0 ~ pattern/ { print "MATCH" }' 

更新:

削除/記載されている問題を解決する推奨されているように。今私はif文での使用のためにawkコマンドの結果を返すことに問題があります。変数RESが設定されていない第2の場合には、入力ラインがパターンに含まれていない場合ので、

pattern="abc" 
input_line="xyz123 678q we uqa abc asd" 
RES=$(echo $input_line | awk -v pat="$pattern" '$0 ~ pat { print "1" }') 
if [ $RES -eq 1 ]; 
then 
    echo Input line $input_line contains pattern $pattern 
else 
    echo Input line $input_line DOES NOT contains pattern $pattern 
fi 

input_line="tult uil7665 5444tu l098 7tu" 
RES=$(echo $input_line | awk -v pat="$pattern" '$0 ~ pat { print "1" }') 
if [ $RES -eq 1 ]; 
then 
    echo Input line $input_line contains pattern $pattern 
else 
    echo Input line $input_line DOES NOT contains pattern $pattern 
fi 

は、だから私は、次のような出力を持っている:

Input line xyz123 678q we uqa abc asd contains pattern abc 
./test.sh: line 21: [: -eq: unary operator expected 
Input line tult uil7665 5444tu l098 7tu DOES NOT contains pattern abc 
私は、次の「醜い」スニペットを書きました

ifステートメントでこの「醜い」スクリプトスニペットを改善する方法はありますか?あなたがする必要があるだろう、パターンマッチのために参照される変数にはawkを使用するには
おかげ

+0

最後の試行の '/'を取るだけです。 '$ 0〜pattern {print ... ' –

+1

質問を編集しているときに、サンプル入力と出力を含めて、手段 –

答えて

-1

if [[ "$(input_line | awk '/'$pattern'/ { print "MATCH" }')" == "MATCH" ]] 
then 
     pattern matches 
else 
     No pattern matches 
fi 

私は正規表現は可変パターンが参照する動的変数であることを、ここで仮定しています。

awkステートメントの一重引用符の位置に特に注意してください。

+0

決してこれをしないでください。複数の基本的なシェルやawkの方法では間違っています。 –

+0

説明してもらえますか? –

+0

シェル変数を引用してシェル変数の値を拡張してawkスクリプトのテキストの一部にすることは、絶対にしないでください。任意のシェルイントロテキストとhttp://cfajohnson.com/shell/cus-faq-2.html#Q24、またはgoogleを参照してください。あなたは今もさらに変数を実行しようとしているので、代わりにあなたのPATH内の同じ名前のコマンドをすべてピックアップします。また、bashが行うことができる正規表現の一致にawkを使用しています。また、終了ステータスを使用するだけの場合には、awkからテキストを生成して比較することもできます。 OPコードは正しいものでした。 –

関連する問題