awk - 使用 awk 查看日志文件输出时将时间戳转换为 UTC 偏移量
问题描述
我有一个格式为时间戳的文件:
2020-06-10 04:51:34.572 INFO: [17] Log message
我希望能够以UTC+{n}查看输出
如果尝试:
awk '{
#for(timefield = 2;timefield<=NF;timefield++)
timefield = 2
#cmd = "date --date=\x27"TZ=UTC+7\" \"" $timefield "\"x27"
#cmd = "date --date=\"TZ=UTC+7\" "" $timefield"
cmd = "date --date=\"TZ=Europe/London\" "" $timefield"
# if($timefield ~ /[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}/) {
while(cmd | getline line) {
sub($timefield,line,$0)
}
print
}'
但我越来越awk: line 12: runaway regular expression /} ...
更新:
制定正确的报价有很多困难。
获取时区转换的正确 GNU 日期语法是:
~# date --date='TZ="Asia/Bangkok" 2020-06-10 03:19:16.222'
Tue Jun 9 20:19:16 UTC 2020
请注意节中的单引号 ("'") --date='
。如何在awk cmd
命令中正确引用它?
解决方案
考虑到需要awk
在 shell 中引用脚本,实现正确的引用很烦人。从 OP 评论来看,将日志文件中的 GMT 时间转换为香港时间 (UTC+7) 的目标。
遵循 OP 结构,可以执行以下操作。
#! /bin/sh
awk '
{
t_in = $1 " " $2
cmd = "TZ=UTC+7 date -d \"" t_in "Z\""
cmd | getline t_out
$1 = t_out
$2 = ""
print
}
'
值得一提的是,此解决方案将在每一行上调用日期实用程序。对于大文件(超过 10,000 行),这可能会很昂贵。如果是这种情况,可以使用使用内置 awk 方法的替代解决方案。
推荐阅读
- c# - ObservableCollection Xamarin
- c# - 使用带有 ProgressBar 的 HttpClient 下载文件
- reactjs - Redux 订阅和更新 UI
- html - 本地主机中的浏览器无法识别 CSS
- node.js - 如何将多个文件上传到 Google Cloud Storage + Node.js?
- botframework - 在 Microsoft BotFramework 的自适应卡片中定义 Tab 键顺序
- sql-server - 我正在尝试在 sql server 中创建触发器,但出现错误“关键字‘用户’附近的语法不正确。”
- angular - 从 Angular 8 的下拉列表中删除/禁用选定的选项(动态创建的)
- python - Python:一次用于多个参数的 TypeVar
- ios - 如何在 iOS 14 @main 文件中获取 UIWindow 值?