2017-04-19 103 views
1

我正在解析一些日志文件,并且只想提取日期和时间数据。日志文件是这样的:从bash中的字符串中提取日期和时间

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 

字符串将永远是星号t与DateTime(前2列),第二次数据将始终为9个字符长。

我曾尝试:

fgrep "end" *.txt -a/
| awk '{ print $1 " " $2 " " $4 }' 

但仅适用于在我的例子中第二行。

我在想,我可以用awk得到前2列,但不知道如何得到3次列。

+1

您不需要同时使用'fgrep'和'awk'。 –

回答

1

采用单呆子方法:

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)开始字段值 - 内“收集”现场数据

+0

最佳答案,因为它的灵活性。这更容易改变我的需求 –

+0

@TadijaBagarić,谢谢 – RomanPerekhrest

+0

这是比必要的更复杂,你应该提及它是特定于gawk的,因为match()的3rg arg。你应该逃避RE中的'.'。 –

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

鉴于你的问题的例子,你需要的是比赛时间数据[mm:ss.000]

$ 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 

如果这不是你需要的,那么编辑y我们的问题是提供更真实的代表性样本输入和预期产出。

+0

我编辑了这些例子。基本上,我不能相信在同一行中不会有更多的空格或括号。我明白知道为什么这是回答问题的重要信息 –

+0

我看到您添加了新的输入行,但未添加该行的预期输出,因此它的使用非常有限。此外,该行不能出现在awk脚本的输入中,因为它不会被'fgrep“end”'产生,所以它现在比有用的更混乱。 –

+0

幸运的是找到了答案。感谢您的意见,让我更加详细地了解awk。 –

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