更有效地将奇数日期格式转换为Linux日期识别的方法
这是我拥有的一堆文件中的日期格式,
$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
withafter next 2 characters after previous rule
- insert
:
after next 2 characters after previous rule - insert
:
after next 2 characters after previous rule
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
假设您始终在输入文件中获得相同的格式,则单个 sed 可以使用多个捕获组来处理此问题:
Assuming you are always getting same format in input file, a single sed can handle this with multiple capture groups:
使用您显示的样本,请尝试以下
AWK
代码。简单的解释将是,将字段分离器设置为t
或空格。在主要程序打印子字符串(使用substr
awk
>的功能)中,根据所需的输出,使用第一,第二和第三字段使用相应的子字符串。With your shown samples, please try following
awk
code. Simple explanation would be, setting field separator asT
OR spaces. In main program printing sub strings(usingsubstr
function ofawk
) where printing respective sub strings using 1st, 2nd and 3rd fields as per required output.