尝试按如下方式转换日志文件每一行的初始时间戳
$ cat test.log
[Tue Apr 9 03:32:21 2024] {cmd1}
[Tue Apr 9 03:33:42 2024] {cmd2}
[Tue Apr 9 03:35:51 2024] {cmd3}
$
$ cat test.log | < How ?? >
2024-04-09 03:32:21 cmd1
2024-04-09 03:33:42 cmd2
2024-04-09 03:33:42 cmd3
$
尝试过这些选项,但没有成功
$ cat test.log
[Tue Apr 9 03:32:21 2024] {cmd1}
[Tue Apr 9 03:33:42 2024] {cmd2}
[Tue Apr 9 03:35:51 2024] {cmd3}
$
$ cat test.log | awk -F"[][{}]" '{print $2" "$4}'
Tue Apr 9 03:32:21 2024 cmd1
Tue Apr 9 03:33:42 2024 cmd2
Tue Apr 9 03:35:51 2024 cmd3
$
$ cat test.log | awk -F"[][{}]" '{print strftime("%F %T", $2)" "$4}'
1970-01-01 00:00:00 cmd1
1970-01-01 00:00:00 cmd2
1970-01-01 00:00:00 cmd3
$
strftime() 函数返回纪元时间的开始
$ date -d "Tue Apr 9 03:32:21 2024" +"%s"
1712633541
$
$ echo 1712633541 | awk '{print strftime("%F %T", $0)}'
2024-04-09 03:32:21
$
还尝试了 system() 函数
$ echo "Tue Apr 9 03:32:21 2024" | awk '{print strftime("%F %T", system("date -d \"$0\" +\"\%s\""))}'
awk: cmd. line:1: warning: escape sequence `\%' treated as plain `%'
date: invalid date 'sh'
1970-01-01 00:00:01
$
这里有一个方法:
paste -d '\0' \
<(sed 's/^\[//; s/].*//' test.log | date -f - '+%F %T') \
<(sed 's/[^]]*]//' test.log)
Perl 和 Time::Piece 来救援!
<test.log perl -MTime::Piece -lne '
/\[(.+)\] \{(.+)\}/;
print Time::Piece->strptime($1, "%a %b %d %H:%M:%S %Y")
->strftime("%F %T"), " $2"'
-n
逐行读取输入,运行每行代码;-l
从输入中删除换行符并将其添加到 print
;/\[(.+)\] \{(.+)\}/
匹配输入行并记住 $1
和 $2
中的时间戳和命令;strptime
解析时间戳并将其格式化为所需的格式。
strftime
,而不是
03:35:51
- 但输入也是如此,所以我猜这是一个拼写错误。