例如,这些是我的日志的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个字符串/文字位置开始。 (只是一个示例数字)
答案 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
它基本上从标准输入读取一行,即从您的日志文件中读取。然后使用冒号字符作为分隔符将该行拆分为其组成字段。然后提取会话并修剪空格。然后打开一个文件以附加会话名称,并将该行写入该文件。重复此操作直到整个日志都已处理完毕。