我正在解析一些日志文件,并且只想提取日期和时间数据。日志文件如下所示:
2017-03-01 12:00:15.896 Sync DeliveryContacts: 00:00.011(00.011) end
2017-03-01 12:00:16.473 SyncTables(): 00:00.293(00.293) end
2017-03-01 12:02:48.636 00:00.000(00.000) end
编辑 - 这也是文件中可能的一行:
2017-03-01 12:00:15.896 Sync Delivery Contacts: 00:00.011(00.011) Started with predefined delay (10:00.000) end
我想得到这样的3列:
[YYYY-MM-DD] [hh:mm:ss.000] [mm:ss.000]
或:
2017-03-01 12:00:15.896 00:00.011
2017-03-01 12:00:16.473 00:00.293
2017-03-01 12:02:48.636 00:00.000
字符串将始终以DateTime(前2列)开头,第二次数据始终为9个字符。
我试过了:
fgrep "end" *.txt -a /
| awk '{ print $1 " " $2 " " $4 }'
但这仅适用于我的示例中的第二行。
我在想我可以使用awk获得前两列,但不知道如何获得该3列时间。
答案 0 :(得分:2)
你可以使用这个awk:
fgrep "end" *.txt -a | awk '{sub(/\(.*/, "", $(NF-1)); print $1, $2, $(NF-1)}'
2017-03-01 12:00:15.896 00:00.011
2017-03-01 12:00:16.473 00:00.293
2017-03-01 12:02:48.636 00:00.000
sub
函数用于删除以(
答案 1 :(得分:1)
使用单个 gawk 方法:
awk '{r=""; for(i=3;i<=NF;i++){ r=r$i };
match(r, /\<([0-9]{2}:[0-9]{2}\.[0-9]{3})\(/, a); print $1,$2,a[1];}' file
输出:
2017-03-01 12:00:15.896 00:00.011
2017-03-01 12:00:16.473 00:00.293
2017-03-01 12:02:48.636 00:00.000
for(i=3;i<=NF;i++){ r=r$i };
- 从第3个字段开始连接字段值
match(r, /([0-9]{2}:[0-9]{2}.[0-9]{3})\(/, a)
- 匹配&#34;收集的时间数据[mm:ss.000]
&#34;现场数据
答案 2 :(得分:1)
鉴于您的问题中的示例,您只需要:
$ awk -F'[ (]' '{print $1, $2, $(NF-2)}' file
2017-03-01 12:00:15.896 00:00.011
2017-03-01 12:00:16.473 00:00.293
2017-03-01 12:02:48.636 00:00.000
如果这不是您所需要的,那么请编辑您的问题,以提供更具真实代表性的样本输入和预期输出。
答案 3 :(得分:0)
awk '{print $1,$2, substr($(NF-1),1,9)}' file
2017-03-01 12:00:15.896 00:00.011
2017-03-01 12:00:16.473 00:00.293
2017-03-01 12:02:48.636 00:00.000