awk:尝试将时间戳字符串转换为unix纪元时间

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

我尝试使用 awk 将时间戳字符串转换为 unix 纪元时间,但多次尝试后失败。

$ echo "2024-04-16 16:32:38.108580" | awk '{ epoch = mktime(gensub(/[:-]/, " ", "g", $1)) + substr($1, index($1, ".")+1) ; print epoch }'
2023
linux unix awk
2个回答
0
投票

您正在

$1
上进行手术,但应该在
$0
上进行手术。如果您检查了命令的中间步骤,您就会看到这一点。

这应该有效:

$ echo "2024-04-16 16:32:38.108580" |
  awk '{
    i = index($0, ".")
    datespec = gensub(/[:-]/, " ", "g", substr($0,1,i-1))
    epoch = mktime(datespec) + substr($0,i)
    printf "%f\n", epoch
  }'
1713281558.108580
$

0
投票

mktime()
正在寻找格式为
YYYY MM DD HH MM SS
的输入,所以在这种情况下我们想要:

### convert this:

2024-04-16 16:32:38.108580

### to this:

2024 04 16 16 32 38

我们可以通过几种方式做到这一点:

gensub(/[:-]|[.].*$/, " ", "g")
  gsub(/[:-]|[.].*$/, " ")

因为我没有指定字段或变量来操作函数,所以操作整行(即

$0
)。

OP 的代码仅对第一个空格分隔的字符串 (

$1
) 执行操作,在本例中为
2024-04-16
。 OP 需要指定前 2 个字段 (
$1 " " $2
) 或整行(
$0
- 如果未指定字段则默认行为)。

由于示例输入只有 2 个空格分隔的字段,我们将继续处理整行 (

$0
)。

将这些更改拉入新的

awk
脚本中:

### verify conversion of input format:

$ echo "2024-04-16 16:32:38.108580" | awk '{ print gensub(/[:-]|[.].*$/, " ", 

“g”)}' 2024年04月16日16日32日38日

### convert to epoch seconds:

$ echo "2024-04-16 16:32:38.108580" | awk '{ print mktime(gensub(/[:-]|[.].*$/, " ", "g")) }'
1713303158

### reverse operation to verify we've got the correct epoch seconds

$ date '+%Y-%m-%d %H:%M:%S' -d @1713303158
2024-04-16 16:32:38
© www.soinside.com 2019 - 2024. All rights reserved.