|
zjjzh
初级用户
积分 25
发帖 14
注册 2006-12-20
状态 离线
|
『楼 主』:
求助高手,如何读取日志文件中指定某一字段内容
求助各位高手,我现在应用中记录一个日志aa.xml
日志内容是:
....
<description>应用系统告警add ssd,请解决。</description>
....
description里的内容格式有空格和逗号等。
脚本如何实现获取应用系统告警add ssd,请解决。并赋值给变量
比如call tt.bat %1 其中%1的值就是“应用系统告警add ssd,请解决”
另外,日志是持续的写进去,所以不能重复读取,只读取最新的内容。
各位老大帮忙啊。
|
|
2010-3-18 15:49 |
|
|
Hanyeguxing
银牌会员
正在学习中的菜鸟...
积分 1039
发帖 897
注册 2009-3-1 来自 在地狱中仰望天堂
状态 离线
|
『第
2 楼』:
如果“<description>应用系统告警add ssd,请解决。</description>”的前后没有空格或制表符的话,可以:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (aa.xml) do set P=%%i&if "!P:~0,13!"=="<description>" if "!P:~-14!"=="</description>" set M=!P:~13,-14! 这个时候M就是你要的变量
没明白你要call他干什么呢?
[ Last edited by Hanyeguxing on 2010-3-18 at 16:13 ]
|
批处理之家 http://bbs.bathome.net/forum-5-1.html |
|
2010-3-18 16:10 |
|
|
zjjzh
初级用户
积分 25
发帖 14
注册 2006-12-20
状态 离线
|
『第
3 楼』:
非常感谢楼上解答。call只是一个例子,我是用另外一个命令行来调用这个变量。发给告警平台。
|
|
2010-3-18 16:58 |
|
|
zjjzh
初级用户
积分 25
发帖 14
注册 2006-12-20
状态 离线
|
『第
4 楼』:
Quote: | Originally posted by Hanyeguxing at 2010-3-18 04:10 PM:
如果“<description>应用系统告警add ssd,请解决。</description>”的前后没有空格或制表符的话,可以:
[code]@echo off&setlocal enabledelayedexpansion
... |
|
M变量取不到。我刚测试了下,另外,这个处理程序是从头开始读取,而不是读取最新的信息。
老大,能做到读取最新的值吗?
|
|
2010-3-18 18:01 |
|
|
Hanyeguxing
银牌会员
正在学习中的菜鸟...
积分 1039
发帖 897
注册 2009-3-1 来自 在地狱中仰望天堂
状态 离线
|
『第
5 楼』:
按你提供的代码,测试通过
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (aa.xml) do (
set P=%%i
if "!P:~0,13!"=="<description>" if "!P:~-14!"=="</description>" set M=!P:~13,-14!&echo !M!
)
echo %M% echo !M!这个时候的变量M是动态的,所有的
echo %M%这个时候的变量M没有动态扩展,是!M!值的最后一个,也就是最新的
这个批处理依据的是对字符串的截取比较,所以要求:
<description>...</description>必须在同一行
<description>前面没有空格、制表符或其他任何字符
</description>后面没有空格、制表符或其他任何字符
[ Last edited by Hanyeguxing on 2010-3-18 at 18:49 ]
|
批处理之家 http://bbs.bathome.net/forum-5-1.html |
|
2010-3-18 18:25 |
|
|
zjjzh
初级用户
积分 25
发帖 14
注册 2006-12-20
状态 离线
|
『第
6 楼』:
Quote: | Originally posted by Hanyeguxing at 2010-3-18 06:25 PM:
按你提供的代码,测试通过
[code]@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (aa.xml) do (
set P=%%i
if "!P:~0,13!"=="<descriptio ... |
|
description前后没有空格之类的
aa.xml内容:
test
test
<description>应用系统告警add ssd,请解决。</description>
<description>应用系统告警add ssd,请解决1。</description>
df
test
test
<description>应用系统告警add ssd,请解决2。</description>
<description>应用系统告警add ssd,请解决3。</description>
批处理显示的结果为:
ECHO 处于关闭状态。
ECHO 处于关闭状态。
应用系统告警add ssd,请解决。
应用系统告警add ssd,请解决1。
应用系统告警add ssd,请解决1。
应用系统告警add ssd,请解决1。
应用系统告警add ssd,请解决1。
应用系统告警add ssd,请解决2。
应用系统告警add ssd,请解决3。
应用系统告警add ssd,请解决3。
|
|
2010-3-18 18:41 |
|
|
Hanyeguxing
银牌会员
正在学习中的菜鸟...
积分 1039
发帖 897
注册 2009-3-1 来自 在地狱中仰望天堂
状态 离线
|
『第
7 楼』:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (aa.xml) do set P=%%i&if "!P:~0,13!"=="<description>" if "!P:~-14!"=="</description>" set M=!P:~13,-14!
echo %M% 你只用echo %M%不就可以了吗?
|
批处理之家 http://bbs.bathome.net/forum-5-1.html |
|
2010-3-18 18:45 |
|
|
zjjzh
初级用户
积分 25
发帖 14
注册 2006-12-20
状态 离线
|
『第
8 楼』:
Quote: | Originally posted by Hanyeguxing at 2010-3-18 06:45 PM:
[code]@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (aa.xml) do set P=%%i&if "!P:~0,13!"=="<description>" if "!P:~-14!"==& ... |
|
很感谢Hanyeguxing耐心对菜鸟的解答。
这个是取最后一条的值,但是有个问题就是,如果同时增加了3条,那么就丢掉前面2条的信息了。
批处理有没有命令在读取那一段的时候,可不可以做个flag标记,这样再次去读的时候就不会丢掉信息了。
|
|
2010-3-18 18:56 |
|
|
Hanyeguxing
银牌会员
正在学习中的菜鸟...
积分 1039
发帖 897
注册 2009-3-1 来自 在地狱中仰望天堂
状态 离线
|
|
2010-3-18 19:06 |
|
|
zjjzh
初级用户
积分 25
发帖 14
注册 2006-12-20
状态 离线
|
『第
10 楼』:
对的,我就是要求2的。
只要新增的不管多少条,都要显示。
|
|
2010-3-18 19:11 |
|
|
Hanyeguxing
银牌会员
正在学习中的菜鸟...
积分 1039
发帖 897
注册 2009-3-1 来自 在地狱中仰望天堂
状态 离线
|
『第
11 楼』:
方法有很多中,这是其中之一,使用fc输出新增差异再解析。其他方法例如可以记录每次读取的行等等都可以:
@echo off&setlocal enabledelayedexpansion
::说明:old.txt为上一次的文件备份,new.txt为本次的文件备份,bak.txt为差异文件。
if not exist old.txt copy aa.xml old.txt>nul
copy aa.xml new.txt>nul
fc /c old.txt new.txt >bak.txt
for /f "eol=* skip=1 delims=" %%i in (bak.txt) do set P=%%i&if "!P:~0,13!"=="<description>" if "!P:~-14!"=="</description>" set M=!P:~13,-14!&echo !M!
if "%M%"=="" echo 无新增加警告信息
del old.txt
ren new.txt old.txt
pause 要求:
aa.xml必须是每次都在原有的内容基础上在下面新增加内容。
[ Last edited by Hanyeguxing on 2010-3-18 at 20:02 ]
|
批处理之家 http://bbs.bathome.net/forum-5-1.html |
|
2010-3-18 19:40 |
|
|
Hanyeguxing
银牌会员
正在学习中的菜鸟...
积分 1039
发帖 897
注册 2009-3-1 来自 在地狱中仰望天堂
状态 离线
|
『第
12 楼』:
这个方法也可以
@echo off&setlocal enabledelayedexpansion
::说明:ata.log为读取记录日志
if not exist data.log (set n=1) else set/p n=<data.log
for /f "skip=%n% delims=" %%i in (aa.xml) do (set P=%%i&set/a k+=1
if "!P:~0,13!"=="<description>" if "!P:~-14!"=="</description>" set M=!P:~13,-14!&echo !M!)
set/a k=%k%+%n%
>data.log echo %k%
if "%M%"=="" echo 无新增加警告信息
pause 要求:
aa.xml必须是每次都在原有的内容基础上在下面新增加内容。
说明:
本批处理未经过测试
[ Last edited by Hanyeguxing on 2010-3-18 at 21:08 ]
|
批处理之家 http://bbs.bathome.net/forum-5-1.html |
|
2010-3-18 19:59 |
|
|
zjjzh
初级用户
积分 25
发帖 14
注册 2006-12-20
状态 离线
|
『第
13 楼』:
老大你太强了。佩服。。
再次感谢解决我的问题。
|
|
2010-3-18 20:12 |
|