次の場合、終了コード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
slurps
multiline
ファイル全体は修飾子を使用して、//m
文字列に対してアクティブな行の先頭でキーワードを検索します。これは、イン&ワールドが相補的であるという事実を説明するためのものです!
。SUCCESS
Perl
Unix
Sed
don't print unless asked for
モードで実行され、そのコマンドにも終了ステータスが含まれているとします-n
。GNU sed
q