[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理命令for循环如何从后往前读一个文件?

for循环中的skip参数可以忽略从前往后数的行数(当for读取文件的时候),那么我的问题是,如果我想从后往前读呢?例如从后往前读一百行。
因为我想没隔一段时间(例如五分钟)读取最新的log信息,也就是最后几行是否出现某关键字,当关键字存在,我就goto,跳出循环。如果从前往后一直读,也是可以实现的,但是当log文件很大时,效率就成问题了。

谢谢大家。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 CrLf 于 2012-3-20 18:57 编辑
  1. for /f "delims=" %%a in ('sort /+4096 a.txt') do echo %%a
复制代码
最长行需低于4096字符,若要支持更长行,还需修改/rec开关
1

评分人数

TOP

下载一个tail.exe试试吧

TOP

回复 2# CrLf


    非常感谢,该段代码确实实现了倒序输出,但是并不能实现截取,想请教在此基础上,如何实现截取前100行或者前N行的文本信息。

另外还有一个小小的请求,我的目的是提高效率,因为我的log文件非常大,可能要几万行十几万行的样子,如果每行读取的话会降低效率,所以实现的代码不要全读文件,如果是以那种方式那我就全白忙活了呵呵。

在此表示感谢!

TOP

本帖最后由 zfen12x 于 2012-3-21 13:51 编辑

回复 2# CrLf
  1. @echo off
  2. start "test" %1 %2 %3
  3. type nul > old.log
  4. type nul > new.log
  5. :loop
  6. fc new.log old.log&&taskkill /f /t /fi "windowtitle eq XYZ*"&&start "test" %1 %2 %3
  7. ::fc new.log old.log&&taskkill /f /t /fi "windowtitle eq Administrator: test"&&start "test" %1 %2 %3
  8. copy /y new.log old.log >nul
  9. wmic os get name /every:60 /repeat:6 >nul
  10. for /f "delims=: tokens=3" %%i in ('sort /+4096 new.log') do if /i "%%i" == " Executed" goto exit
  11. goto loop
  12. :exit
  13. taskkill /f /t /fi "windowtitle eq Administrator: test"
复制代码
请参考代码,我想在for循环里面做一些改动,目前是从上往下读取,并截取关键字。最理想的想法是从下往上,倒序读一百行,检查里面是否有我想要的关键字。

TOP

回复 4# zfen12x


    两个方案:
  1. @echo off
  2. for /f "delims=" %%a in ('find /c /v ""^<win.log') do set /a skip=%%a-100
  3. more +%skip% win.log|sort /+4096 >tmp.log
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. sort /+4096 win.log /o tmp.log
  3. (for /l %%a in (1 1 100) do (
  4.    set str=&set /p str=
  5.    echo;!str!
  6. ))<win.log >tmp.log
复制代码
1

评分人数

TOP

本帖最后由 zfen12x 于 2012-3-21 15:00 编辑

回复 6# CrLf


    谢谢斑竹的回复,谢谢你。

TOP

返回列表