Board logo

标题: [文本处理] findstr能读取指定文件中包含指定字符串的最后一行内容吗? [打印本页]

作者: psstudio    时间: 2018-12-11 12:29     标题: findstr能读取指定文件中包含指定字符串的最后一行内容吗?

有一个LOG文件需要读取和判断,需要的字符串一般出现在LOG文件的最后一行,开始的时候用这个代码:
  1. for /f "usebackq delims=" %%i in ("C:\Program Files (x86)\zpp\adb.log") do (echo %%i > lastline.txt)
复制代码
,发现在当程序运行的时候并不能读取,只能先复制出来才可以。会出现(系统找不到文件 C:\Program Files (x86)\zpp\adb.log。)而且效率不并高,把LOG文件逐行内容读取到 lastline.txt里,随着LOG的变大,时间会越来越长。后面发现findstr 可以直接查找指定的字符串,再用代码:
  1. for /F "tokens=4 delims=[]" %%a in ('findstr /c:"sr = error_shell_ok, ir = error_insufficient_storage" "C:\Program Files (x86)\zpp\adb.log"') do (echo %%a)
复制代码
,可以很准确的读出来指定的字符串,但是有个问题就是它会把LOG文件里所有符合条件的字符串都读出来,但是程序要求是读取最新的资料,一般这个字符串都在LOG文件的最后一行里,请教一下有没有什么好办法可以做到~。用findstr这条命令的话。附上LOG文件。
作者: psstudio    时间: 2018-12-11 12:31

像上面的LOG文件,只取最后一行,也就是最新的内容里的6334赋值给一个变量,方便后续操作~
作者: Batcher    时间: 2018-12-11 13:21

  1. for /F "tokens=4 delims=[]" %%a in ('findstr /c:"sr = error_shell_ok, ir = error_insufficient_storage" "C:\Program Files (x86)\zpp\adb.log"') do (
  2.     set "str=%%a"
  3. )
  4. echo %str%
复制代码
这样可以吗?
作者: psstudio    时间: 2018-12-11 13:32

这样肯定是可以的,但是感觉效率不高,有没有能直接读取最后一行的操作~。。嘿嘿。。
作者: psstudio    时间: 2018-12-11 13:33

LOG文件有时会很大,几十M都有可能的~
作者: Batcher    时间: 2018-12-11 15:29

回复 5# psstudio


    用那个几十M的文件测试一下3楼代码,看看需要多少秒?
作者: yhcfsr    时间: 2018-12-11 15:42

本帖最后由 yhcfsr 于 2018-12-11 15:49 编辑

实测117万行数据(97M) 1秒内完成
  1. findstr /c:"sr = error_shell_ok, ir = error_insufficient_storage" adb.log.txt|gawk "END{print}"
复制代码
GAWK下载
作者: xczxczxcz    时间: 2018-12-11 16:09

来个更快的
  1. Powershell "gc 'xxxx\xxx.log' -readcount 0 -tail 1"
复制代码

作者: psstudio    时间: 2018-12-12 15:21

膜拜楼上的大神。。。。。。
作者: Batcher    时间: 2018-12-12 16:22

回复 7# yhcfsr


    去掉findstr,直接用gawk做字符串匹配,效果如何呢?




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2