标题: [文本处理] [已解决]批处理命令for循环如何从后往前读一个文件? [打印本页]
作者: zfen12x 时间: 2012-3-20 14:33 标题: [已解决]批处理命令for循环如何从后往前读一个文件?
for循环中的skip参数可以忽略从前往后数的行数(当for读取文件的时候),那么我的问题是,如果我想从后往前读呢?例如从后往前读一百行。
因为我想没隔一段时间(例如五分钟)读取最新的log信息,也就是最后几行是否出现某关键字,当关键字存在,我就goto,跳出循环。如果从前往后一直读,也是可以实现的,但是当log文件很大时,效率就成问题了。
谢谢大家。
作者: CrLf 时间: 2012-3-20 18:54
本帖最后由 CrLf 于 2012-3-20 18:57 编辑
- for /f "delims=" %%a in ('sort /+4096 a.txt') do echo %%a
复制代码
最长行需低于4096字符,若要支持更长行,还需修改/rec开关
作者: find 时间: 2012-3-20 19:04
下载一个tail.exe试试吧
作者: zfen12x 时间: 2012-3-21 09:28
回复 2# CrLf
非常感谢,该段代码确实实现了倒序输出,但是并不能实现截取,想请教在此基础上,如何实现截取前100行或者前N行的文本信息。
另外还有一个小小的请求,我的目的是提高效率,因为我的log文件非常大,可能要几万行十几万行的样子,如果每行读取的话会降低效率,所以实现的代码不要全读文件,如果是以那种方式那我就全白忙活了呵呵。
在此表示感谢!
作者: zfen12x 时间: 2012-3-21 09:34
本帖最后由 zfen12x 于 2012-3-21 13:51 编辑
回复 2# CrLf - @echo off
-
- start "test" %1 %2 %3
- type nul > old.log
- type nul > new.log
- :loop
- fc new.log old.log&&taskkill /f /t /fi "windowtitle eq XYZ*"&&start "test" %1 %2 %3
- ::fc new.log old.log&&taskkill /f /t /fi "windowtitle eq Administrator: test"&&start "test" %1 %2 %3
- copy /y new.log old.log >nul
- wmic os get name /every:60 /repeat:6 >nul
- for /f "delims=: tokens=3" %%i in ('sort /+4096 new.log') do if /i "%%i" == " Executed" goto exit
- goto loop
- :exit
- taskkill /f /t /fi "windowtitle eq Administrator: test"
复制代码
请参考代码,我想在for循环里面做一些改动,目前是从上往下读取,并截取关键字。最理想的想法是从下往上,倒序读一百行,检查里面是否有我想要的关键字。
作者: CrLf 时间: 2012-3-21 14:10
回复 4# zfen12x
两个方案:- @echo off
- for /f "delims=" %%a in ('find /c /v ""^<win.log') do set /a skip=%%a-100
- more +%skip% win.log|sort /+4096 >tmp.log
复制代码
- @echo off&setlocal enabledelayedexpansion
- sort /+4096 win.log /o tmp.log
- (for /l %%a in (1 1 100) do (
- set str=&set /p str=
- echo;!str!
- ))<win.log >tmp.log
复制代码
作者: zfen12x 时间: 2012-3-21 14:56
本帖最后由 zfen12x 于 2012-3-21 15:00 编辑
回复 6# CrLf
谢谢斑竹的回复,谢谢你。
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |