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

使用awk从Bash脚本中的文件中获取最新的Timsstamp,bash,awk,Bash,Awk,我看了很久,发现您不能通过/etc中的syslog-startup.conf将syslog输出同时指向缓冲区和文件。请参见以下内容: 我的解决方案是让cron作业运行bash脚本,每隔几分钟运行一次,从缓冲区抓取日志并将其保存到嵌入式linux设备上的文件中。方法是通过执行类似于logread>>我的日志文件的操作,从缓冲区中获取第一组日志,然后从我的日志文件中获取最后一个条目,从中获取时间戳,然后使用它获取时间戳大于此时间戳的新日志 我在尝试将timstamp插入awk命令时遇到了一个问题 i

我看了很久,发现您不能通过/etc中的syslog-startup.conf将syslog输出同时指向缓冲区和文件。请参见以下内容:

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

我在尝试将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}"
if[-f“${VAR_FILE}”];然后
LASTTS=$(tail-n1“${VAR_FILE}”| grep-o'^.*swi-')
LASTTS=$(sed's/\{5\}$/'>“${VAR\u FILE}”
我一直在获取所有日志,而不是那些>我的最后一个时间戳的日志。如果我更改awk命令以硬编码实际日期,它就会起作用

awk'$0>“3月15日14:20:50”'msgs>>“${VAR\u FILE}”


我做错了什么?

所以我想要的答案是:

awk -v var="$LASTTS" '$0 > var' msgs >> "${VAR_FILE}"
这就解决了我之前遇到的问题。但现在我面临的事实是,当最后一个时间戳被重新复制时,它总是重复的。

有三种情况:

  • 还没有保存到文件中
  • 缓冲区有新内容和一些旧内容
  • 缓冲区只有新内容(我们遗漏了一些内容)
  • 我们只想从缓冲区追加新内容

    假设busybox awk和外壳:

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

    为什么您需要登录到缓冲区而不是直接登录到文件?@jhnc我需要在缓冲区和文件中都有日志。文件将保存在SD卡上,SD卡容易损坏,因此如果发生这种情况,我们希望在缓冲区中有日志,我们可以访问。使用网络选项发送到中央l可能更可靠oghost。日志文件内容的示例是什么?请注意,日期格式不可排序。我认为当最后一行是
    Mar…
    并且缓冲区包含
    Apr…
    时,这可能会失败。我实际上不知道logread产生的输出是什么。如果时间戳不够精细,则可以使用此代码复制日志重复行。例如,所见:
    ../t1a/t1b/t1c/t1a
    ,缓冲区:
    t1a/t1b/t1c/t1a/t2d
    应追加
    t2d
    ,但实际上将追加
    t1b/t1c/t1a/t2d
    。然而,除非检查的间隔太远以至于我们碰到案例3,否则不会丢失任何内容。