从bash

时间:2017-04-19 14:03:17

标签: bash awk

我正在解析一些日志文件,并且只想提取日期和时间数据。日志文件如下所示:

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列时间。

4 个答案:

答案 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