使用|| 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,在这种情况下 makeawk返回非零退出状态:

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

相关内容