2017-04-24 76 views
0

我有一個具有異常的日誌文件,其中異常在單獨的行上。我想要sed/awk/cut將它們組合在一起。規則。第一行的開頭總是有日期時間戳。如何將來自多行的日誌異常合併到一行

例:(5線除外)

2017-04-24T04:26:58.728-0400 - VALUE {tomcat-device-http-1} none|none 
[{{0ecfe8a7}{Uri, - WARN Could not marshal entity 
java.lang.ArrayIndexOutOfBoundsException: -1 
    at com.sun..java:487) 
    at com.sun:323) 
    at com.sun.java:251) 

最終結果:

2017-04-24T04:26:58.728-0400 - VALUE {tomcat-device-http-1} none|none [{{0ecfe8a7}{Uri, - WARN Could not marshal entity java.lang.ArrayIndexOutOfBoundsException: -1 at com.sun..java:487) at com.sun:323) at com.sun.java:251) 
+0

沒有別的從日期時間戳開始? – stevesliva

+1

由於工具(awk,sed,tr)通常不在Windows環境中,因此[batch-file]標記看起來不對。 – LotPings

+0

您是在DOS上還是在Windows命令行終端上運行?你確定你想把它全部放在一行 - 即使堆棧跟蹤中有一百個級別(這也是我在Java堆棧跟蹤中看到的)。 –

回答

0

下面是一個簡單而有效的(快速)解決方案,使用JREPL.BAT - a regular expression text processor。 JREPL.BAT是純粹的腳本(混合批處理/ JScript),它可以在XP以後的任何Windows機器上本機運行 - 不需要任何第三方exe文件。

以下將直接從命令行工作,不需要批處理文件。

如果日誌文件test.log中已經存在,你想在屏幕上看到輸出,則:

jrepl "^(?:(\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d.\d{3}-\d{4} -)|\s*)(.*)" "stdout.write(($1?'\n'+$1:' ')+$2);$txt=false" /jmatchq /f test.log 

如果你想將結果寫入到文件「output.log」,然後追加/o output.log

如果要覆蓋原文件,然後追加/o -

如果你想把命令在批處理腳本,然後使用call jrepl

如果您有一個將日誌寫入stdout的程序,那麼您可以將程序輸出傳送到該命令並刪除/f選項。

logGeneratingCommand | jrepl "^(?:(\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d.\d{3}-\d{4} -)|\s*)(.*)" "stdout.write(($1?'\n'+$1:' ')+$2);$txt=false" /jmatchq 

很明顯,你可以添加/o outfile/o -選項。

CALL在使用管道時不需要批處理腳本。

完整的JREPL文檔可從命令行通過jrepl /?jrepl /??獲取分頁幫助。總結的選項列表可通過jrepl /?options獲得。使用jrepl /?help獲取所有幫助選項的完整列表。

0

此批處理文件做你想要什麼:

@echo off 
setlocal EnableDelayedExpansion 

(
for /F "delims=" %%a in (input.txt) do (
    set "line=%%a" 
    if "!line:~0,2!" equ "20" echo/ 
    set /P "=%%a " 
) 
echo/ 
) <NUL> output.txt 
相關問題