使用Awk从BASH脚本中获取File的最新TimsStamp



我看上去很长,发现您无法通过syslog-startup.conf在/etc中将Syslog输出引导到缓冲区和文件。请参阅此信息:https://unix.stackexchange.com/questions/449156/how-to-set-up-syslog-to-log-to-log-to-to-both-file-buffer

我的解决方案是让一个cron作业运行一个bash脚本,该脚本将每隔几分钟运行,以从缓冲区中获取日志,并将其保存到我的嵌入式Linux设备上。方法是我通过执行诸如logread >> my_log_file之类的操作,从缓冲区中获取第一组日志。

我遇到了一个试图插入awk命令

的问题
if [ -f "${VAR_FILE}" ]; then
    LASTTS=$(tail -n 1 "${VAR_FILE}" | grep -o '^.*swi-')
    LASTTS=$(sed 's/.{5}$//' <<< "$LASTTS")
    echo $LASTTS
fi
awk '$0 > "${LASTTS}"' msgs >> "${VAR_FILE}"

我不断获取所有日志>我上一个时间戳。如果我更改awk命令以将实际日期进行硬编码为

,它可以正常工作。

awk '$0 > "Mar 15 14:20:50"' msgs >> "${VAR_FILE}"

我在做什么错?

有三种情况:

  1. 尚未保存到文件
  2. 缓冲区有新内容和一些旧内容
  3. 缓冲区只有新内容(我们错过了一些)

我们只想附加来自Buffer的新内容。

假设BusyBox尴尬和外壳:

#!/bin/sh
if [ ! -f "$log" ]; then
    # case 1
    logread > "$log"
else
    prev="$(tail -n 1 "$log")"
    # case 2 or 3
    logread | awk -v prev="$prev" '
        new { print; next }
        $0==prev { new=1 }
        END { exit !new } # "fail" if no old line
    ' >> "$log" 
    # case 3
    [ -n $? ] && logread >> "$log"
fi

所以我要寻找的答案是:

awk -v var="$LASTTS" '$0 > var' msgs >> "${VAR_FILE}"

这倾向于解决我遇到的问题。但是现在我面对这样的事实,它始终重复了最后一个时间戳

最新更新