如何将多行的日志异常组合到一行

时间:2017-04-24 17:05:47

标签: batch-file awk sed tr

我有一个包含异常的日志文件,异常位于不同的行上。我想让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)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

以下是使用JREPL.BAT - a regular expression text processor的简单高效(快速)解决方案。 JREPL.BAT是纯脚本(混合批处理/ JScript),可以在任何Windows机器上从XP开始本地运行 - 不需要第三方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

如果要将结果写入文件&#34; output.log&#34;,请附加/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获取所有帮助选项的完整列表。