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 中是否有更简单/更好的方法来完成此操作?
要更改的规则如下
- 在前 4 个字符后插入
-
- 在前一个规则后的下 2 个字符后插入
-
- 在前一个规则后的下 2 个字符后插入
-
- 将
T
替换为
在前一个规则之后的下两个字符后
- 在前一个规则后的下 2 个字符后插入
:
- 在前一个规则后的下 2 个字符后插入
:
假设您总是在输入文件中获得相同的格式,单个 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
或空格。在主程序中打印子字符串(使用 awk
的 substr
函数),其中根据需要的输出使用第 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
这是我拥有的一堆文件中的日期格式
$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 中是否有更简单/更好的方法来完成此操作?
要更改的规则如下
- 在前 4 个字符后插入
-
- 在前一个规则后的下 2 个字符后插入
-
- 在前一个规则后的下 2 个字符后插入
-
- 将
T
替换为 - 在前一个规则后的下 2 个字符后插入
:
- 在前一个规则后的下 2 个字符后插入
:
假设您总是在输入文件中获得相同的格式,单个 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
或空格。在主程序中打印子字符串(使用 awk
的 substr
函数),其中根据需要的输出使用第 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