在执行 Tail -f 日志文件时,如何使用 Awk 将 unix 时间戳转换为人类可读的时间戳?

在执行 Tail -f 日志文件时,如何使用 Awk 将 unix 时间戳转换为人类可读的时间戳?

我目前正在做一个tail -f mysql.log并且也有它颜色编码。但是我如何使用 awk 将 unix 时间戳转换为人类可读的格式?

tail -f /var/lib/mysql/mysql-slow.log | awk '/User@Host:/ { $0 = "\033[32m" $0 "\033[39m" } /Query_time:/ { $0 = "\033[36m" $0 "\033[39m" } 1'

在此输入图像描述

答案1

如果您有 GNU awk ( gawk),这在非嵌入式 Linux 和 Cygwin 上通常是这种情况,那么您可以使用strftime功能。

if (match($0, /^(.*timestamp=)([0-9]+)(.*)$/, parts)) {
    time = strftime("%F %T", parts[2]);
    $0 = parts[1] time parts[3];
}

在带有 BusyBox 的嵌入式系统上,您可能有一个更受限制的 awk 版本,但有一个date能够执行转换的实用程序。

if (match($0, /timestamp=[0-9]+/)) {
    system("date +'%F %T' -d " substr($0, RSTART+10, RLENGTH-10)) | getline time;
    $0 = substr($0, 1, RSTART) time substr($0, RSTART+RLENGTH);
}

仅使用 POSIX 工具,除了自己计算之外,无法在人类可读的日期和 Unix 时间戳之间进行转换。 (我知道网上有 shell 和 awk 代码可用,但我没有方便的链接。)我建议确保您安装了更好的东西,例如 gawk、perl、python 等。

答案2

丢弃颜色 - 您可以使用:

# | piped at the end 
awk -F'SET timestamp=' 'NF > 1{ system("date -d @" $2) }'

与重置同时剥离颜色使其更具挑战性;我怀疑您可以通过删除与结尾相关的转义序列来控制/调整它时间戳部分。

相关内容