使用awk从Bash脚本中的文件中获取最新的Timsstamp
我看了很久,发现您不能通过/etc中的syslog-startup.conf将syslog输出同时指向缓冲区和文件。请参见以下内容: 我的解决方案是让cron作业运行bash脚本,每隔几分钟运行一次,从缓冲区抓取日志并将其保存到嵌入式linux设备上的文件中。方法是通过执行类似于使用awk从Bash脚本中的文件中获取最新的Timsstamp,bash,awk,Bash,Awk,我看了很久,发现您不能通过/etc中的syslog-startup.conf将syslog输出同时指向缓冲区和文件。请参见以下内容: 我的解决方案是让cron作业运行bash脚本,每隔几分钟运行一次,从缓冲区抓取日志并将其保存到嵌入式linux设备上的文件中。方法是通过执行类似于logread>>我的日志文件的操作,从缓冲区中获取第一组日志,然后从我的日志文件中获取最后一个条目,从中获取时间戳,然后使用它获取时间戳大于此时间戳的新日志 我在尝试将timstamp插入awk命令时遇到了一个问题 i
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}"
这就解决了我之前遇到的问题。但现在我面临的事实是,当最后一个时间戳被重新复制时,它总是重复的。有三种情况:
#!/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,否则不会丢失任何内容。