|| awk ENVIRON 交換使用後

|| awk ENVIRON 交換使用後

タイムスタンプに基づいてログファイルを切り取るためにawkと変数を使用しています。

LAST_LOG=$last_log awk 'index($0, ENVIRON["LAST_LOG"]) {y=1;next};y' $log_file ;

日付がログファイルにまだ存在する場合は機能しますが、awkログファイルがアーカイブされて新しいファイルに置き換えられると失敗します。

cat $log_file失敗したらawk次に置き換えたいです。

LAST_LOG=$last_log awk 'index($0, ENVIRON["LAST_LOG"]) {y=1;next};y' $log_file ; \
  || cat $log_file

しかし、この構文はsyntax error near unexpected token ||

上記の行は、後で使用または使用できる&&通常の機能ではありませんか?||

答え1

問題; ||

LAST_LOG=$last_log awk 'index($0, ENVIRON["LAST_LOG"]) {y=1;next};y' $log_file ; || cat $log_file

;呼び出しを終了すると、awk次のコマンドが始まります。||これは構文エラーです。

あなたが望むのは、yログファイルの解析の終わりに1でないことを確認することです。この場合、make はawkゼロ以外の終了状態を返します。

LAST_LOG="$last_log" awk '
  index($0, ENVIRON["LAST_LOG"]) { y = 1; next }
  y                              { print }
  END                            { exit !y }' <"$log_file" || cat <"$log_file"

明示的でない場合、exit何らかの種類のエラーが発生すると、ゼロ以外の終了状態が得られます。awk

答え2

コメントを見ると、POコマンドを修正/調整する方法が明らかです。わずかに異なるgnu-Awkアプローチを使用してください。

awk -v L=$last '$0 ~ L {y=1;next};y; END{if(!y) system("cat " FILENAME)}' $log
  • たぶん条件は$0 ~ Lより具体的です(例えば、$1 <= Lまたは$1 == L)。

関連情報