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表示替换模式将作为表达式进行评估。
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 纪元。(没有明确给出午夜;在您省略一天中的时间时,它会隐式使用。)
1571889039 秒的调整被添加到时间。显然,请改用您的时间戳。文档为此功能使用“相对”一词。
有一个更简洁的版本,仅由联机帮助页中的示例记录,适用于较新版本的 gnu date:
$ date -d @2147483647
Mon Jan 18 19:14:07 PST 2038
Run Code Online (Sandbox Code Playgroud)
如果您需要经常操作日期,请了解您的日期命令。它不仅仅是一个时钟;它是 shell 的日期/时间库。