bash 将奇数日期格式转换为由 linux 日期识别的更有效方法

bash more efficient way to convert odd date format to be recognized by linux date

这是我拥有的一堆文件中的日期格式

$cat ./file.log
20220405T130001 message1
20220405T130002 message2
20220405T130003 message3
20220405T130004 message4
20220405T130005 message5

我可以通过这样做将其转换为可用的日期格式:

$cat ./file.log | sed 's/^\(.\{4\}\)/-/' | sed 's/^\(.\{7\}\)/-/' | sed 's/\(.\{10\}\)./ /' |  sed 's/^\(.\{13\}\)/:/' | sed 's/^\(.\{16\}\)/:/
2022-04-05 13:00:01 message1
2022-04-05 13:00:02 message2
2022-04-05 13:00:03 message3
2022-04-05 13:00:04 message4
2022-04-05 13:00:05 message5

这看起来效率很低。在 bash 中是否有更简单/更好的方法来完成此操作?

要更改的规则如下

假设您总是在输入文件中获得相同的格式,单个 sed 可以处理多个捕获组:

sed -E 's/^(.{4})(..)(..)T(..)(..)/-- ::/' file

2022-04-05 13:00:01 message1
2022-04-05 13:00:02 message2
2022-04-05 13:00:03 message3
2022-04-05 13:00:04 message4
2022-04-05 13:00:05 message5

使用您显示的示例,请尝试以下 awk 代码。简单的解释是,将字段分隔符设置为 T 或空格。在主程序中打印子字符串(使用 awksubstr 函数),其中根据需要的输出使用第 1、第 2 和第 3 字段打印相应的子字符串。

awk -F'T| ' '
{
  print substr(,1,4)"-"substr(,5,2)"-"substr(,7,2),substr(,1,2)":"substr(,3,2)":"substr(,5,2),
}
' Input_file