2017-04-19 105 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