中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 求助高手,如何读取日志文件中指定某一字段内容
作者:
标题: 求助高手,如何读取日志文件中指定某一字段内容 上一主题 | 下一主题
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
来自 在地狱中仰望天堂
状态 离线
『第 9 楼』:  

1,每次增加N条内容到源文件中,只要最新的,也就是最后一条记录。
如果你要求这样,那么楼上批处理得到的就是这个。
2,每次增加N条内容到源文件中,只要最新的,也就是后增加近来的所有条数。以后每次如此读取,如此类推。
你要求的是这样的?



批处理之家 http://bbs.bathome.net/forum-5-1.html
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
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: