批处理文件,根据不同的会话ID将一个日志文件分成多个日志

时间:2014-02-04 10:20:35

标签: batch-file logging

例如,这些是我的日志的3行:

  

DEBUG - 2014-01-06 02:18:07,346 TraceWriter.Butler:   zhnpz7pBrH0R6lXzlFxbdSD:/ Butler:

     

INFO - 2014-01-06 02:18:07,361 TraceWriter.Butler:   zhnpz7pBrH0R6lXzlFxbdSD:/ Butler:

     

INFO - 2014-01-06 08:27:10,533 TraceWriter.Butler:   Aa3efY237sf96AGEDn1AJ9 - :/ Butler:

这里我有2个不同的会话ID“zhnpz7pBrH0R6lXzlFxbdSD”& “Aa3efY237sf96AGEDn1AJ9-” 所以我想要2个不同的文本文件,每个文件只包含一个特定会话ID的行。

这可能会有所帮助:会话ID总是长度为23个字符,并始终从第53个字符串/文字位置开始。 (只是一个示例数字)

4 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
FOR /f "delims=" %%a IN (q21549658.txt) DO (
 SET destfile=%%a
 SETLOCAL ENABLEDELAYEDEXPANSION
 >>"!destfile:~52,23!.log" ECHO(%%a
 endlocal
)

GOTO :EOF

我使用名为q21549658.txt的文件进行测试。你的数据似乎是最后两行中的一个字符短 - 这些似乎有指定字符串从第52列开始,而不是53(但也可能是剪切和粘贴问题)。

生成的文件是“sessionname.log” - 如“zhnpz7pBrH0R6lXzlFxbdSD.log” - 并将附加到具有这些名称的任何现有文件。假设生成的目标文件名有效。

答案 1 :(得分:0)

你可以用awk做这样的事情:

awk '{s=substr($0,53,23);print $0 >> s}' file

因此它将通过获取您指定的字符来获取sessionid并将其保存在“s”中。然后它会将输入文件的每一行追加到一个名为与会话“s”相同的文件。

答案 2 :(得分:0)

@echo off
setlocal enableextensions disabledelayedexpansion
for /f "tokens=* usebackq" %%a in ("c:\somewhere\file.log") do (
    for /f "tokens=4 delims=:" %%b in ("%%~a") do for /f "tokens=1 delims= " %%c in ("%%~b") do (
        >>"c:\target\%%~c.log" echo(%%a
    )
)

对于输入文件中的每一行,使用adecuate标记(使用冒号作为分隔符)并将该行添加到已填充的文件中。

答案 3 :(得分:0)

好的,因为你在Windows上并且遗憾地缺少awk,这是一个VBscript版本。将其保存在名为“split.vbs”的文件中,然后像这样运行:

cscript /nologo split.vbs < yourlogfile

当然,如果您愿意,可以批量处理。

Const ForAppending = 8
Do While Not WScript.StdIn.AtEndOfStream
   Line = WScript.StdIn.ReadLine()
   fields=Split(Line,":")
   session=Trim(fields(3))
   set objFSO = CreateObject("Scripting.FileSystemObject")
   set objFile = objFSO.OpenTextFile(session, ForAppending, True)
   objFile.WriteLine(Line)
   objFile.close
Loop

它基本上从标准输入读取一行,即从您的日志文件中读取。然后使用冒号字符作为分隔符将该行拆分为其组成字段。然后提取会话并修剪空格。然后打开一个文件以附加会话名称,并将该行写入该文件。重复此操作直到整个日志都已处理完毕。