出力

出力

次の場合、終了コード1を返すにはawkが必要です。

  • grepからawkへの入力は提供されません。
  • 2番目のフィールドが空か存在しません。

grep が "SOME_PHRASE" を見つけた場合に動作しますが、対応するフレーズがない場合、戻りコード ($?) は 0 です。

grep -m1 -i '^SOME_PHRASE' test.txt | awk '{ if (length($val)==0 || $val=="" || length($2)==0) exit 1; else print $2; }'

test.txtの例

Test1 1234  
Phrase 214324

予想出力:

$ echo $?  
1

答え1

実際には以下を組み合わせることができawkますgrep

awk 'BEGIN{rv=1}                      # Default return value is 1
     tolower($0) ~ /^some_phrase/{    # Case insensitive search 
         if($2 != ""){                # If $2 is not empty,
            print $2                  # print the value,
            rv=0                      # and set the return value
         } 
         exit                         # one match, do not process any more line 
     } 
     END{exit rv}
' test.txt

答え2

欲しいものを達成することに成功しました。

grep -m1 -i 'SOME_PHRASE' test.txt | awk 'END { if (NR==0 || $2=="")  exit 1; else print $2;}'

答え3

より直接的に:

$ awk 'toupper($1) ~ /^SOME_PHRASE/ { if ($2) { print $2; exit 0 } else { exit 1 } } END { exit 1 }' test.txt

最初のフィールドは大文字に変更され、大文字のパターンと比較されます。一致する項目があり、2 番目のフィールドがある場合、そのフィールドは印刷され、スクリプトは終了ステータス 0 で終了します。それ以外の場合(2番目のフィールドがない場合)、終了ステータス1で終了します。パターンが一致しない場合、スクリプトは入力の終わりに達すると終了ステータス 1 で終了します。

答え4

簡単にするには、すべてを1つの屋根/ツールの内側に移動することを検討する必要があります。

grep -qE '^SOME_PHRASE.*[^[:space:]]' yourfile

perl -0777ne 'exit !/^SOME_PHRASE.*?\S/m' yourfile

sed -ne '/^SOME_PHRASE.*[^[:space:]]/q;$q1' yourfile

出力

表示されたデータの場合は、上記のいずれかのコマンドを実行した直後に次のコマンドを実行します。

echo "$?"
1

単に

Perl slurpsmultilineファイル全体は修飾子を使用して、//m文字列に対してアクティブな行の先頭でキーワードを検索します。これは、イン&ワールドが相補的であるという事実を説明するためのものです!SUCCESSPerlUnix

Seddon't print unless asked forモードで実行され、そのコマンドにも終了ステータスが含まれているとします-nGNU sedq

関連情報