抓一份异常日志做归因,第一件事不是读,是把几万行压成几百行不重复的。用「TXT处理」四步就够:删空行、去行首尾空格、删重复行、排序;需要合并同类项再补一次正则替换。顺序错了结果就不对,下面说清为什么。

顺序为什么不能反

先去空格,再去重。两条一模一样的报错,一条末尾多一个空格,在比较时就是两行不同内容——去重会双双留下。所以「去除行首尾空格」必须排在删重复行之前。只含空格的行也算空行,这一条同时能把复制粘贴带进来的假空白清掉。

去重发生在排序之前还是之后,取决于你要什么。想保留每条第一次出现的相对位置(还原事件时间线),就先按原顺序去重再单独排一份统计用的;想直接看频次分布,可以先排序让相同行相邻。去重的规则是保留首次出现的位置,不是保留任意一条后随便放。

数字感知这件事

排序可选按 Unicode 码位或中文拼音,两种都具备数字感知:abc2 会排在 abc10 前面。默认按码位排的话,2 的字符小于 1 后面跟 0,会得到 abc10 在 abc2 之前的反直觉结果,版本号、步骤编号、文件名序列全部乱套。

但数字感知是按段拆数字来比大小,它不理解语义单位。同一批日志里混着 v1.10 与 v1.9 这类点分版本时,仍然可能被拆开误排,这种要人工分段核对。中文选拼音排序时,多音字按默认读音归类,专有名词排序结果可能不合预期。

预览只有 500 行

内容超过 5000 行或 200KB 时,输入输出框只显示前 500 行的预览,而处理、统计与下载仍按完整内容执行。这个设计专门用来坑凭眼睛下结论的人:你以为文件里有两千行,导出后发现只剩几十行是正常的,因为原始行数本来就该由统计项给。判断规模请看统计:行数、字符数(含空白与不含空白两种)、中文字符数,以及按输出编码算出的字节数。

字节数那个指标很实用——邮件正文有长度限制、接口有请求体上限时,你要的是字节而不是字符数。

五步清洗流程

  1. 上传或粘贴,先看统计里的行数,记住这个数字作为基线。
  2. 执行去行首尾空格与删空行,行数量级下降说明原来排版噪声很多。
  3. 删重复行,可勾选忽略大小写(同一错误被不同模块打出大小写不一致的版本时会命中)。
  4. 按需排序,中英文混合内容优先试拼音档。
  5. 需要归并同类项时用查找替换,支持区分大小写与 JavaScript 正则语法,界面会显示命中次数——命中数为零通常说明正则里的转义写法不对,别急着以为日志里没有。

边界:输出编码只能选 UTF-8 或 UTF-8 带 BOM,存不出 GBK/ANSI 文件,对方系统要求 GBK 时得下载后用记事本另存为 ANSI。输入侧能自动识别 UTF-8、带 BOM 的 UTF-8 与 GBK/GB18030,不支持 UTF-16、Big5、EUC-KR。全程本地完成、不上传服务器、不需要登录。更多排序细节见 文本去重与排序,入口在 TXT处理。