用一个实例替换同一行的多个实例?

用一个实例替换同一行的多个实例?

标题确实说明了一切。基本上,我正在尝试压缩一个巨大的日志文件。

Notepad++ 和 Regex(我知道一点)可以删除这些重复的行,但问题是,我不想全部删除它们。我希望保留一个实例以保留日志消息的结构/顺序。

我用谷歌搜索了很多答案,但似乎只得到这样的结果问题在于我并不只是想替换或排除线条。

此时,我猜测 Regex 更有可能给出答案,但我仍然处于不知道有哪些工具可用的阶段。

编辑:

我有数千条消息,但只需要查看其中一条:(我看到了大量这样的消息,因为每个 scsi 设备都希望插入自己的消息。我只需要看到它正在发生,而不是它正在发生在每个设备上)。

multipathd[4893]: 3600a098000badf6800005dfe5a8cd2cd: sdie - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000badf6800005def5a8cd273: sdgq - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000badf6800005df05a8cd27b: sdeq - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000bae10c00005df55a8cd2ec: sdgw - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000bae10c00005df05a8cd2c2: sdfk - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000bae10c00005dec5a8cd2a3: sdgm - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000badf6800005df35a8cd292: sdfo - rdac checker reports path is down: ctlr is in startup sequence

但我想看到

rdac checker reports path is down: ctlr is in startup sequence

答案1

如果多个实例连续,您可以执行以下操作:

根据新请求更新:

  • Ctrl+H
  • 找什么:^([^-]+- )(.+)(?:\R(?1)\2)+
  • 用。。。来代替:$2
  • 检查环绕
  • 检查正则表达式
  • 请勿检查. matches newline
  • Replace all

解释:

^           : beginning of line
  (         : start group 1
    [^-]+-  : 1 or more NOT dash,then a dash and a space
  )         : end group 1
  (         : start group 2
    .+      : 1 or more any character
  )         : end group 2
  (?:       : start non capture group 
    \R      : any kind of linebreak
    (?1)    : same pattern than group 1 (ie. "[^-]+- ")
    \2      : backreference to group 2
  )+        : end non capture group, must appears 1 or more times.

替代品:

$2      : content of group 2

给定示例的结果:

rdac checker reports path is down: ctlr is in startup sequence

如果多个实例不连续,您最好用您喜欢的脚本语言编写脚本。

这是一个完成这项工作的 perl 单行程序:

perl -aE 'chomp;(undef,$x)=split(/-/,$_);next if exists $s{$x};$s{$x}=1;say$x' inputfile

相关内容