需要与.bat脚本解析W3C日志帮助
问题描述:
我试图从W3C日志文件(有点像文本文件)获取值(IP地址)。这是我到目前为止,但没有运气:需要与.bat脚本解析W3C日志帮助
Set filename=ex%date:~-2,4%%date:~-10,2%%date:~-7,2%.log
For /F "tokens=2 delims=: . " %%A in ('E:\WINDOWS\system32\LogFiles\MSFTPSVC6141885\%filename%') do (Set ip=%%A)
和日志文件的样子:
# Software: Microsoft Internet Information Services 6.0 # Version: 1.0 #Date: 2009-01-10 20:58:16 #Fields: time c-ip cs-method cs-uri-stem sc-status sc-win32-status #20:58:16 10.10.1.111 [25]USER anonymous 331 0
所以IP地址是5日线第二列(10.10.1.111)
任何反馈将不胜感激!
答
你试过Microsoft Log Parser吗?假设它支持W3C风格的开箱即用的日志文件。我不知道你在做什么,但是它可能比手工制作批处理文件更简单。
或者,安装AWK(例如从Cygwin)。甚至是Perl - 这是它的存在。
答
您for
线改成这样:
For /F "skip=4 tokens=2" %%A in (E:\WINDOWS\system32\LogFiles\MSFTPSVC6141885\%filename%) do (
Set ip=%%A
goto :DONE
)
:DONE
@echo IP = %ip%
:: Continue script
skip=4
会忽略日志文件的前四行并开始解析第5位。 您需要goto
停止解析文件中的其余行,否则您将旋转整个文件,并且ip
将等于最后一行的第二个标记(可能是也可能不是IP地址)。
默认的分隔符是空格,所以你不需要用delims
arg来改变它。您只需要第二个令牌,即IP地址。
由于您正在解析文件的内容,而不是文件名字符串,所以不需要用单引号括起文件名。如果文件名有嵌入空格,您将不得不使用此for
行代替:
For /F "usebackq skip=4 tokens=2" %%A in ("E:\WINDOWS\system32\LogFiles\MSFTPSVC6141885\%filename%") do (
您可以缩进您的代码和日志文件每行4个空格吗?我认为格式化正在破坏正在呈现的一些数据。 – 2009-01-11 06:34:25