更有效地将奇数日期格式转换为Linux日期识别的方法

发布于 2025-01-19 11:54:59 字数 904 浏览 1 评论 0原文

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

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

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

$cat ./file.log | sed 's/^\(.\{4\}\)/\1-/' | sed 's/^\(.\{7\}\)/\1-/' | sed 's/\(.\{10\}\)./\1 /' |  sed 's/^\(.\{13\}\)/\1:/' | sed 's/^\(.\{16\}\)/\1:/
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 中是否有更简单/更好的方法来完成此任务?

要更改的规则如下:

  • 在前 4 个字符后插入 -
  • 在下 2 个字符后插入 - 在上一个规则后
  • 在下 2 个字符后插入 -在上一条规则之后
  • T 替换为 在上一条规则之后的下 2 个字符之后
  • 插入 : 在上一条规则之后的下 2 个字符之后
  • 插入 : 上一条规则后的下 2 个字符之后

Here is the date format in a bunch of files I have

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

I am able to convert it to a usable date format by doing this:

$cat ./file.log | sed 's/^\(.\{4\}\)/\1-/' | sed 's/^\(.\{7\}\)/\1-/' | sed 's/\(.\{10\}\)./\1 /' |  sed 's/^\(.\{13\}\)/\1:/' | sed 's/^\(.\{16\}\)/\1:/
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

This seems very inefficient. Is there an easier / better way to accomplish this in bash?

The rules to change would be the following

  • insert - after first 4 characters
  • insert - after next 2 characters after previous rule
  • insert - after next 2 characters after previous rule
  • replace T with after next 2 characters after previous rule
  • insert : after next 2 characters after previous rule
  • insert : after next 2 characters after previous rule

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

橪书 2025-01-26 11:54:59

假设您始终在输入文件中获得相同的格式,则单个 sed 可以使用多个捕获组来处理此问题:

sed -E 's/^(.{4})(..)(..)T(..)(..)/\1-\2-\3 \4:\5:/' 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

Assuming you are always getting same format in input file, a single sed can handle this with multiple capture groups:

sed -E 's/^(.{4})(..)(..)T(..)(..)/\1-\2-\3 \4:\5:/' 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
深白境迁sunset 2025-01-26 11:54:59

使用您显示的样本,请尝试以下AWK代码。简单的解释将是,将字段分离器设置为t或空格。在主要程序打印子字符串(使用substr awk>的功能)中,根据所需的输出,使用第一,第二和第三字段使用相应的子字符串。

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

With your shown samples, please try following awk code. Simple explanation would be, setting field separator as T OR spaces. In main program printing sub strings(using substr function of awk) where printing respective sub strings using 1st, 2nd and 3rd fields as per required output.

awk -F'T| ' '
{
  print substr($1,1,4)"-"substr($1,5,2)"-"substr($1,7,2),substr($2,1,2)":"substr($2,3,2)":"substr($2,5,2),$3
}
' Input_file
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文