Mehrere Instanzen derselben Zeile durch nur eine Instanz ersetzen?

417
Lee Lemur

Der Titel sagt es wirklich. Im Grunde versuche ich, eine riesige Protokolldatei zu verdichten.

Notepad ++ und Regex (ich kenne ein kleines bisschen) kann diese sich wiederholenden Zeilen löschen, aber das Problem ist, ich möchte nicht, dass sie alle gelöscht werden. Ich möchte, dass eine Instanz verbleibt, um die Struktur / Reihenfolge der Protokollnachrichten zu erhalten.

Ich habe viele eine Antwort googeln, aber ich scheine nur Ergebnisse wie zu bekommen diese . Das Problem ist, dass ich nicht nur versuche, Zeilen zu ersetzen oder auszuschließen.

An diesem Punkt würde ich vermuten, dass Regex eher eine Antwort enthält, aber ich bin immer noch in dem Stadium, in dem ich nicht weiß, welche Tools verfügbar sind.

Bearbeiten:

Beispiel für eine Nachricht, von der ich Tausende habe, aber nur eine davon sehen muss: (Ich sehe Tonnen von diesen, weil jedes scsi-Gerät seine eigene Nachricht einbinden möchte. Ich muss nur sehen, dass es passiert, nicht dass es passiert zu jedem von ihnen).

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 will nur sehen

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

0
"Der Titel sagt es wirklich" Außer dass der Titel anscheinend irreführend ist. Die Zeilen, die Sie dort gezeigt haben, sind nicht "die gleiche Zeile". Es handelt sich um eindeutige Zeilen, wobei die letzten X-Zeichen / Wörter identisch sind. Sie erhalten möglicherweise eine brauchbare Antwort, wenn Sie genau festgestellt haben, welche Teile der Linie überprüft werden müssen und welche Teile ignoriert werden können. spoko vor 6 Jahren 0

1 Antwort auf die Frage

2
Toto

Wenn mehrere Instanzen aufeinanderfolgen, können Sie Folgendes tun:

Update gemäß neuer Anfrage:

  • Ctrl+H
  • Finde was: ^([^-]+- )(.+)(?:\R(?1)\2)+
  • Ersetzen mit: $2
  • Aktivieren Sie die Option Wrap around
  • Überprüfen Sie den regulären 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 Mehrfachinstanzen nicht aufeinander folgen, sollten Sie ein Skript in Ihrer bevorzugten Skriptsprache schreiben.

Hier ist ein Perl-Einzeiler, der die Arbeit erledigt:

perl -aE 'chomp;(undef,$x)=split(/-/,$_);next if exists $s{$x};$s{$x}=1;say$x' inputfile 
@LeeLemur: Ja, das kannst du. Toto vor 6 Jahren 0
Könnten Sie ihnen Beispieltext geben? Keiner hat für mich gearbeitet, und ich habe ziemlich viel damit herumgekitzelt. Lee Lemur vor 6 Jahren 0
@LeeLemur: Bearbeiten Sie Ihre Frage und fügen Sie einige aus Ihrer Datei extrahierte Zeilen und das erwartete Ergebnis hinzu. Toto vor 6 Jahren 0
Ich habe es jetzt getan Lee Lemur vor 6 Jahren 0
@LeeLemur: Aber deine Zeilen sind nicht identisch. Was sind die Regeln, um unerwünschte Zeilen zu löschen? Toto vor 6 Jahren 1
Entschuldigung, ich benutze nur den Teil, der identisch ist, zB "rdac checker reports path is down". Ich habe meinen Beitrag jetzt überarbeitet, um dies zu berücksichtigen Lee Lemur vor 6 Jahren 0
Sie möchten also alle Zeilen verlieren, die mit `rdac checker reports path 'enden: ctlr befindet sich in der Startsequenz`, und sehen Sie an dieser Stelle nur diese Phrase, einmal? Ändern Sie in diesem Fall den Suchtext von @ Toto in `^. * (Der Pfad für die Berichterstellung von rdac checker ist heruntergefahren: ctlr befindet sich in der Startsequenz) (?: \ R. * \ 1) +` und Sie sind festgelegt. Zumindest eine Fehlermeldung. spoko vor 6 Jahren 1