在Windows 10上,我有一个运行了数千个周期的系统的大日志(最多几兆字节),每个周期输出一行-除了在某些情况下。此行以循环编号开始。
我想找到没有行输出的情况,这相当于我想找到两个在周期数方面不连续的输出(之间的周期将是无声的,而我正在寻找的周期)。
2345, <data>
2346, <data>
2347, <data>
2349, <data>
在这个例子中,2349不是2347之后的下一个数字,因此周期2348是无声的。
如何使用regexp来实现这一点,比如说在Notepad++中?或者,如何以其他方式轻松地做到这一点,也许是在命令行中(即批处理脚本),也许是使用一些不需要太多环境的简单脚本语言?我不认为我有任何安装以外的python(我可以写一个python脚本自己-但想别的东西)。
我可以写一个10倍的OR语句,其中,对于循环数的每个最后可能的数字,下一行必须以一个循环数开始,并以下一个数字结束。(在9的情况下为0)。但这有点笨重和丑陋。
2条答案
按热度按时间nwwlzxa71#
我想用增强型文本编辑器EmEditor的J模式来处理。很容易理解进展。
共3步:
1.按Ctrl+H打开替换对话框,键入搜索和替换表达式。
1.单击按钮“高级...”,然后激活选项
“正则表达式“.”可以匹配换行符”
假设日志文件有10000行,那么不要忘记设置
“用于搜索正则表达式的其他行:“
到10000,EmEditor会将整个文件视为一个字符串。
1.点击“提取”按钮以获得所需结果。
正则表达式:
查找:
^.+$
更换:
\J var str=""; arr="\0".match(/\d+/g); for(var i=arr[0]; i<=arr[arr.length-1]; i++){if("\0".search(i)<0){str=str+i+"\n";"Lost number are: \n"+str;}}
Replace表达式解释:\J为J模式,是必不可少的前缀。对于该表达式,使用以下方式帮助理解:
请看截图。
evrscar22#
使用bash shell的解决方案(无正则表达式):
将输出缺少的数字。
这是通过让
comm
比较2个排序列表并只显示第一个列表唯一的项来实现的。(第二个列表中唯一的项被
-2
抑制,两个列表中共有的项被-3
抑制)第一个列表是从FILENAME中提取的第一个“列”。第二个列表是
seq
基于FILENAME中的第一行(“最低”数字)和最后一行(“最高”数字)生成的顺序号的排序列表关于FILENAME内容的假设:
<data>
是单行)如果要指定要手动检查的范围(例如1000到3000),使用这个: