找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 28104|回复: 6

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

[复制链接]
发表于 2012-3-20 14:33:42 | 显示全部楼层 |阅读模式
for循环中的skip参数可以忽略从前往后数的行数(当for读取文件的时候),那么我的问题是,如果我想从后往前读呢?例如从后往前读一百行。
因为我想没隔一段时间(例如五分钟)读取最新的log信息,也就是最后几行是否出现某关键字,当关键字存在,我就goto,跳出循环。如果从前往后一直读,也是可以实现的,但是当log文件很大时,效率就成问题了。

谢谢大家。

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

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

评分

参与人数 1技术 +1 收起 理由
QIAOXINGXING + 1 学习了。。。

查看全部评分

发表于 2012-3-20 19:04:33 | 显示全部楼层
下载一个tail.exe试试吧
 楼主| 发表于 2012-3-21 09:28:08 | 显示全部楼层
回复 2# CrLf


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

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

在此表示感谢!
 楼主| 发表于 2012-3-21 09:34:54 | 显示全部楼层
本帖最后由 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循环里面做一些改动,目前是从上往下读取,并截取关键字。最理想的想法是从下往上,倒序读一百行,检查里面是否有我想要的关键字。
发表于 2012-3-21 14:10:52 | 显示全部楼层
回复 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技术 +1 收起 理由
zfen12x + 1 热心帮助!

查看全部评分

 楼主| 发表于 2012-3-21 14:56:57 | 显示全部楼层
本帖最后由 zfen12x 于 2012-3-21 15:00 编辑

回复 6# CrLf


    谢谢斑竹的回复,谢谢你。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 21:12 , Processed in 0.027492 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表