Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何将多行日志异常合并到一行_Batch File_Awk_Sed_Tr - Fatal编程技术网

Batch file 如何将多行日志异常合并到一行

Batch file 如何将多行日志异常合并到一行,batch-file,awk,sed,tr,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.ArrayIndexOutOfBoundsExcept

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

此批处理文件执行您想要的操作:

@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
@echo关闭
setlocal EnableDelayedExpansion
(
对于(input.txt)do中的/F“delims=“%%a”(
设置“行=%%a”
如果“!行:~0,2!”等于“20”回显/
设置/P“=%%a”
)
回音/
)output.txt

下面是一个简单高效(快速)的解决方案,使用。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-

如果要将命令放入批处理脚本中,请使用
calljrepl

如果您有一个将日志写入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-
选项

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 
使用管道时,批处理脚本中不需要调用


可通过命令行通过
JREPL/?
JREPL/??
获取完整的JREPL文档,以获取分页帮助。可通过
jrepl/?options
获得选项摘要列表。使用
jrepl/?help
查看所有帮助选项的完整列表。

没有其他选项以日期-时间戳开头?由于工具(awk、sed、tr)通常不在windows环境中,因此[batch file]标记似乎是错误的。您是在DOS上运行,还是在windows命令行终端中运行?即使堆栈跟踪中有一百个级别(这是我在Java堆栈跟踪中经常看到的),您确定要将所有内容都放在一行中吗。