如何转换每行的初始时间戳

问题描述 投票:0回答:2

尝试按如下方式转换日志文件每一行的初始时间戳

$ 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
$ 
linux bash awk
2个回答
1
投票

这里有一个方法:

paste -d '\0' \
  <(sed 's/^\[//; s/].*//' test.log | date -f - '+%F %T') \
  <(sed 's/[^]]*]//' test.log)

0
投票

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
- 但输入也是如此,所以我猜这是一个拼写错误。
    

© www.soinside.com 2019 - 2024. All rights reserved.