將同一行的多個實例替換為僅一個實例?

將同一行的多個實例替換為僅一個實例?

標題說的是真的。基本上我正在嘗試壓縮一個巨大的日誌檔案。

Notepad++和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

相關內容