我使用 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
)