使用awk从Bash脚本中的文件中获取最新的Timsstamp

时间:2019-03-19 16:49:22

标签: bash awk

我已经看了很长时间,发现无法通过/ etc中的syslog-startup.conf将syslog输出定向到缓冲区和文件。请参见:https://unix.stackexchange.com/questions/449156/how-to-set-up-syslog-to-log-to-both-file-buffer

我的解决方案是让cron作业运行bash脚本,该脚本每隔几分钟运行一次,以从缓冲区中获取日志并将其保存到文件中,然后放入嵌入式Linux设备中。方法是通过执行logread >> my_log_file之类的操作从缓冲区中获取第一组日志,然后从my_log_file中获取最后一个条目,从中获取时间戳,然后使用它来获取具有时间戳的新日志大于此时间戳。

我在尝试将timstamp插入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}"

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

有三种情况:

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

我们只想追加缓冲区中的新内容。

假设busybox awk和shell:

#!/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

答案 1 :(得分:0)

所以我一直在寻找答案:

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

这倾向于解决我遇到的问题。但是现在我面临这样的事实,它总是在最后一次重印时重复