bat如何提取文本指定行的内容
背景:使用CTS框架运行完测试后,会在logs中生成devices_log和host_log,在results中生成相应的结果(报告)。根据报告信息我们可以得知失败的用例,但是却不能知道为什么用例会失败,是脚本有问题?设备有问题?还是其他.....。此时我们就得通过 截图、视频、log等信息进行分析。然而事实却是很痛苦的,打开log一看密密麻麻的,整个module的日志都在这里面。我就看失败的那条日志,难道还要我选中一段,然后Ctrl+C、Ctrl+V吗?那条用例的log有上千行啊!mmp(通过关键字查找虽然能找到失败的那条,想再进行过滤的话,总是会被其他日志干扰)

问题:我怎样才能拿到我想要的那段log呢?
思路:从log看到会有“TestRunner:started:” 和“TestRunner: finished:”字符串,也就是用例的开始和结束。只要拿到开始和结束的行数就行了。

解决:输入行数提取文本内容。
No1:输入需要截取文本内容的开始和结束行即可。
@echo off &setlocal enabledelayedexpansion
title ExtractContent
color 0a
rem ++++++++++++++++++++++++++++++++++++++++
rem Extract.bat
rem By zhzw @2018/1/18
rem
rem Version: 1.0
rem ++++++++++++++++++++++++++++++++++++++++
echo 1.Can't handle empty lines
:next
echo.
echo 请输入开始行和结束行^>^>^>
set /p sRow=StartRow:
set /p eRow=EndRow: set stime=%time:~0,2%%time:~3,2%%time:~6,2%%time:~9,2%
if "%stime:~0,1%"==" " set "stime=0%stime:~1%"
set /a sRow=%sRow%-1
if "%sRow%"=="0" (set sRow=) else set sRow=skip=%sRow% set start=%sRow:~5%
set stop=%eRow%
if "%stop%"=="" echo."EndRow" cant be equal to null &goto done for /f "%sRow% tokens=* delims=" %%a in (device_logcat.txt) do (
rem echo %sRow%
set /a start+=1
echo %stop%----!start!
echo.%%a >>%stime%.txt
if "%stop%"=="!start!" goto end
)
:end
echo done
set etime=%time:~0,2%%time:~3,2%%time:~6,2%%time:~9,2%
if "%etime:~0,1%"==" " set "etime=0%time:~1%"
echo 开始时间:%stime%
echo 结束时间:%etime%
rem timeout /t 2 &exit
:done
ping 127.0.0.1 -n 3 >nul 2>nul &echo.
echo 终止提取Ctrl+C;继续提取,请按任意键继续...&pause >nul
cls &echo.Try again extract...&goto next
上面的方法不能处理空行(默认不会把空行算为一行),如果文本中出现空行则会导致与所需要的文本内容行数有相差。速度快(貌似是个完美主义者!~_~)
No2:处理了空行的问题。如果行数过大且文本超过MB,读取速度慢,而且行数相差大。(读取整个文本>忽略开始行数-1>截取分隔>写入文本)
@echo off
title ExtractContent
color 0a
rem @mode con lines=35 cols=75
rem ++++++++++++++++++++++++++++++++++++++++
rem Extract.bat
rem By zhzw @2018/1/18
rem
rem Version: 1.0.1
rem ++++++++++++++++++++++++++++++++++++++++
echo 1."StartRow" and "EndRow" cant be equal to null
echo.
set /p sRow=StartRow:
set /p eRow=EndRow: set stime=%time:~0,2%%time:~3,2%%time:~6,2%
if "%stime:~0,1%"==" " set "stime=0%stime:~1%"
set /a sRow=%sRow%-1
if "%sRow%"=="0" (set sRow=) else set sRow=skip=%sRow% for /f "%sRow% tokens=1,* delims=:" %%a in ('findstr /n ".*" device_logcat.txt') do (
rem echo %sRow%
echo %eRow%----%%a
echo.%%b >>%stime%.txt
if %eRow%==%%a goto end
)
:end
echo.
echo done
set etime=%time:~0,2%%time:~3,2%%time:~6,2%
if "%etime:~0,1%"==" " set "etime=0%time:~1%"
echo 开始时间:%stime%
echo 结束时间:%etime%
rem timeout /t 2 &exit
pause
No3:弥补数据准确性的问题,大行数时速度慢[No1>No3>No2]。(以行号查找文本中指定行>写入文本)
@echo off &setlocal enabledelayedexpansion
title ExtractContent
color 0a
rem ++++++++++++++++++++++++++++++++++++++++
rem Extract.bat
rem By zhzw @2018/1/18
rem
rem Version: 1.0.2
rem ++++++++++++++++++++++++++++++++++++++++
echo 1."StartRow" and "EndRow" cant be equal to null
echo.
set /p sRow=StartRow:
set /p eRow=EndRow: set stime=%time:~0,2%%time:~3,2%%time:~6,2%
if "%stime:~0,1%"==" " set "stime=0%stime:~1%" set start=%sRow%
set /a stop=%eRow%+1
echo.
:replay
rem echo %start%
for /f "tokens=1,* delims=:" %%a in ('findstr /n ".*" device_logcat.txt ^| findstr /b "\<%start%:"') do (
set /a start+=1
echo %stop%----!start!
if "%stop%"=="!start!" goto end
echo.%%b >>%stime%.txt &goto replay
)
:end
echo.&echo done
set etime=%time:~0,2%%time:~3,2%%time:~6,2%
if "%etime:~0,1%"==" " set "etime=0%etime:~1%"
echo 开始时间:%stime%
echo 结束时间:%etime%
rem timeout /t 2 &exit
pause
去除空行处理:
type a.txt | findstr /v "^$"
bat如何提取文本指定行的内容的更多相关文章
- css3实现超出文本指定行数(指定文本长度)用省略号代替
测试代码: <!DOCTYPE html> <html> <head> <meta name="viewport" content=&qu ...
- Linux查看文件指定行数内容
1.tail date.log 输出文件末尾的内容,默认10行 tail -20 date.log 输出最后20行的内容 tail -n -20 date ...
- 【Sed】使用sed删除文件指定行的内容
sed多看帮助文档,受益良多 sed -i '$d' filename 例如删除 /etc/profile的最后一行 cat -n /etc/profile ... 101 export PA ...
- Linux 显示文本指定行内容
主要采用sed.head和tail命令 如果文本中使用了 \n 这类符号,cat命令会把它当成换行符,结果会出错 $ sed -n "10p" move.sh # 显示第10行 ...
- Shell 获取指定行的内容
需求: 有一个文件,根据指定的字符串,得到该字符串上两行的内容. 文件内容如下: linux-56:# cat sys.ttconnect.ini # Copyright (C) 1999, 2006 ...
- php替换文件指定行的内容
//第一种 利用file 函数 读取文件,每一行都是一个数组元素 $arr = file($file); $arr[$line] = "hello"; file_put_conte ...
- linux在文件中包含某个关键词的指定行插入内容
1. 在包含某个关键字的行上面插入一行文字 sed -i '/wangzai/i\doubi' 1.txt 把内容doubi插入到包含wangzai关键字的上一行 2. 在包含某个关键字的行下面插入一 ...
- linux 向文本指定位置写入内容
sed -i "37 r a.txt" test.txt ====== 向test.txt 的第37行后,也就是38行后写入a.txt的内容 sed -i "38i aa ...
- 利用css3实现超出文本指定行数与省略号效果
<style> .text1 {/*单行*/ width:200px; overflow:hidden; text-overflow:ellipsis; -o-text-overflow: ...
随机推荐
- c语言 贪食蛇小游戏
---恢复内容开始--- #include <stdio.h>#include <windows.h>#include <stdlib.h>#include < ...
- 向dnsrecord.txt 中添加 配置
#!/bin/bash Ip_addr=`cat /etc/dnsrecord.txt |awk '{print $1}' |head -1` Check_dns_url(){ grep $1 /et ...
- 【网络爬虫入门03】爬虫解析利器beautifulSoup模块的基本应用
[网络爬虫入门03]爬虫解析利器beautifulSoup模块的基本应用 1.引言 网络爬虫最终的目的就是过滤选取网络信息,因此最重要的就是解析器了,其性能的优劣直接决定这网络爬虫的速度和效率.B ...
- Centos7使用man查找命令时,报错No manual entry for xxxx
man ascii时报错 解决报错的方法: yum install man-pages
- 【译】第十一篇 SQL Server安全审核
本篇文章是SQL Server安全系列的第十一篇,详细内容请参考原文. SQL Server审核SQL Server审核是指你可以在数据库或服务器实例监控事件.审核日志包含你选择捕获的事件的列表,在服 ...
- (2)Java数据结构--二叉树 -和排序算法实现
=== 注释:此人博客对很多个数据结构类都有讲解-并加以实例 Java API —— ArrayList类 & Vector类 & LinkList类Java API —— BigDe ...
- lcx工具使用
0x01 为什么要作端口转发? 如果外网服务器,我们直接连接其端口就能进行访问,不需要进行端口转发.所以端口转发常用于穿透防火墙. 0x02 快速使用 前提:你的计算机处于公网,被控制的计算机能访问外 ...
- java基础梳理--朝花夕拾(三)
1.了解面向对象的编程思想以及面向对象的特性: 对象: EveryThing is Object: 万物皆是对象,在程序中,我们可以将类.接口.方法.属性等都认为是对象: 面向对象: 是一种程序设计方 ...
- 极客时间|AI技术内参
学习进度: 014 | 精读AlphaGo Zero论文
- PHP反序列化漏洞学习
serialize:序列化 unserialize: 反序列化 简单解释: serialize 把一个对象转成字符串形式, 可以用于保存 unserialize 把serialize序列化后的字符串变 ...