Mehrere Instanzen derselben Zeile durch nur eine Instanz ersetzen?

Mehrere Instanzen derselben Zeile durch nur eine Instanz ersetzen?

Der Titel sagt eigentlich schon alles. Im Grunde versuche ich, eine riesige Protokolldatei zu komprimieren.

Notepad++ und Regex (ich kenne mich ein bisschen aus) können diese sich wiederholenden Zeilen löschen, aber das Problem ist, dass ich sie nicht alle löschen möchte. Ich möchte, dass eine Instanz erhalten bleibt, um die Struktur/Reihenfolge der Protokollmeldungen beizubehalten.

Ich habe viele Antworten gegoogelt, aber ich bekomme nur Ergebnisse wieDas. Das Problem besteht darin, dass ich nicht nur versuche, Zeilen zu ersetzen oder auszuschließen.

An diesem Punkt würde ich vermuten, dass Regex eher eine Antwort bietet, aber ich bin immer noch in der Phase, in der ich nicht weiß, welche Tools verfügbar sind.

Bearbeiten:

Beispiel einer Meldung, von der ich Tausende habe, aber nur eine sehen muss: (Ich sehe Tonnen davon, weil jedes SCSI-Gerät seine eigene Meldung einspeisen möchte. Ich muss nur sehen, dass es passiert, nicht, dass es bei jedem einzelnen passiert.)

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

Aber ich möchte nur sehen

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

Antwort1

Wenn mehrere Instanzen aufeinander folgen, können Sie Folgendes tun:

Aktualisierung gemäß neuer Anfrage:

  • Ctrl+H
  • Finde was:^([^-]+- )(.+)(?:\R(?1)\2)+
  • Ersetzen mit:$2
  • check Umwickeln
  • check Regulärer Ausdruck
  • NICHT PRÜFEN. matches newline
  • Replace all

Erläuterung:

^           : 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.

Ersatz:

$2      : content of group 2

Ergebnis für gegebenes Beispiel:

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

Wenn die mehreren Instanzen nicht aufeinander folgen, sollten Sie besser ein Skript in Ihrer bevorzugten Skriptsprache schreiben.

Hier ist ein Perl-Einzeiler, der diese Aufgabe erfüllt:

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

verwandte Informationen