タイムスタンプに基づいてログファイルを切り取るために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
)。