将 Unix 时间戳转换为人类可读的时间

The*_*jam 17 awk text-processing date timestamps

我想查看一个带有 awk/grep 的文本文件,它在第一列中包含一个 Unix 时间戳。如何在查看时将其转换为人类可读的时间?

wur*_*tel 21

如果该行以 unix 时间戳开头,则应该这样做:

perl -pe 's/^(\d+)/localtime $1/e' inputfilename
Run Code Online (Sandbox Code Playgroud)

perl -p对传递的表达式调用循环-e,为输入的每一行执行该表达式,并在循环结束时打印缓冲区。

该表达式使用 substition 命令s///匹配并捕获每一行开头的数字序列,并将其替换为解释为 unix 时间戳的这些数字的本地时间表示。/e表示替换模式将作为表达式进行评估。

  • 或 `perl -MPOSIX -pe 's/^\s*\K\d+/strftime "%FT%T%z", localtime $&/e'` 以获得更有用的时间戳格式(明确且词法排序相同按时间顺序) (4认同)

Ste*_*itt 20

如果您的 AWK 是Gawk,您可以使用strftime

gawk '{ print strftime("%c", $1) }'
Run Code Online (Sandbox Code Playgroud)

将第一列中的时间戳转换为当前语言环境的默认日期/时间表示。

您可以在查看内容之前使用它来转换内容:

gawk '{ print gensub($1, strftime("%c", $1), 1) }' inputfile
Run Code Online (Sandbox Code Playgroud)


cjs*_*cjs 10

正如Dan 在他的回答中提到的,Gnudate(1)命令可以被赋予一个-d带有日期或时间戳的参数,它将被视为要输出的日期。(然而,这在 POSIX 或 BSDdate(1)命令中不可用 。)@1571806800是用于指定time_t整数的格式。

这是一个 Bash shell 函数,它充当过滤器,从输入中读取行,假设所有以数字开头的行的任何单词都是时间戳,并将其转换为我最喜欢的格式之一的人类可读输出。

ts2hr() {
    while read n rest; do
        if [[ $n =~ ^[0-9][0-9]*$ ]]; then
            echo "$(date -d @"$n" +"%Y-%m-%d %T")" "$rest"
        else
            echo "$n" "$rest"
        fi
    done
}
Run Code Online (Sandbox Code Playgroud)

下面是一些输入和输出的样子:

ts2hr <<____
1571806123 first line
# A comment?
1571720456 second date's here
Just a regular sentence.
1571547789 The last line.
____
2019-10-23 13:48:43 first line
# A comment?
2019-10-22 14:00:56 second date's here
Just a regular sentence.
2019-10-20 14:03:09 The last line.
Run Code Online (Sandbox Code Playgroud)

您可以根据需要调整函数以处理您需要的特定输入和输出格式,以及您可用的工具。上面的函数是Bash主要是因为=~操作符让模式匹配更容易;如果你在 Bourne shell 中需要这个,你必须以不同的方式对检查进行编码,如果你确实需要它的话。


小智 7

使用“日期”

为此,您不需要 perl、awk、php 或长算术表达式。你可以用 gnu "date" 来做,这对于这类事情真的非常有用。对于其他版本的“日期”,您的 YMMV。

$ date -d '1/1/1970 GMT 1571889039 seconds'
Wed Oct 23 20:50:39 PDT 2019
Run Code Online (Sandbox Code Playgroud)

这里发生的事情是您正在指定一个时间并对其进行调整。时间是格林威治标准时间 1970 年 1 月 1 日午夜,即 unix 纪元。(没有明确给出午夜;在您省略一天中的时间时,它会隐式使用。)

157188​​9039 秒的调整被添加到时间。显然,请改用您的时间戳。文档为此功能使用“相对”一词。

有一个更简洁的版本,仅由联机帮助页中的示例记录,适用于较新版本的 gnu date:

$ date -d @2147483647
Mon Jan 18 19:14:07 PST 2038
Run Code Online (Sandbox Code Playgroud)

如果您需要经常操作日期,请了解您的日期命令。它不仅仅是一个时钟;它是 shell 的日期/时间库。