sed und grep erhalten die Zeilennummer für eine Übereinstimmung

8

Ich habe eine Log-Datei und ich benutze sed, um die Zeilen zwischen zwei Strings zu extrahieren, die das Wort MATCH enthalten. Ich benutze sed, um die Zeilen zu extrahieren, und grep, um nur die Zeilen aufzunehmen, die das Wort "MATCH" enthalten. Ich würde die Zeilennummer in der Protokolldatei benötigen, in der eine Übereinstimmung gefunden wird.

%Vor%

Ich verwende diesen Befehl, um die Zeilen zu extrahieren:

%Vor%

Meine Ausgabe ist:

%Vor%

Aber ich brauche auch in der Ausgabe die Zeilennummer:

%Vor%     
georgiana_e 15.11.2013, 10:30
quelle

3 Antworten

16

Sie könnten verwenden:

%Vor%

, um die Zeilen zu nummerieren, bevor Sie Ihre sed, wie folgt:

%Vor%

Alternativ können Sie cat -n durch eine Variante von nl ersetzen:

%Vor%     
Mark Setchell 15.11.2013, 10:37
quelle
2
___ answer19999060 ___

Sie könnten verwenden:

%Vor%

, um die Zeilen zu nummerieren, bevor Sie Ihre sed, wie folgt:

%Vor%

Alternativ können Sie %code% durch eine Variante von %code% ersetzen:

%Vor%     
___ tag123bash ___ Für Fragen zu Skripten, die für die Bash-Befehlsshell geschrieben wurden. Für Shell-Skripte mit Fehlern, überprüfen Sie diese bitte mit dem Shellcheck-Programm (oder im web-Shellcheck-Server unter https://shellcheck.net), bevor Sie hier posten. Fragen zur interaktiven Nutzung von Bash sind bei Super Usern eher Thema als bei Stack Overflow. ___ answer19999013 ___

Mein erster Versuch war nicht, die Zeilennummer beizubehalten, weil der %code% -Teil bestimmte Zeilen entfernt.

Alles kann mit diesem %code% gemacht werden:

%Vor%
  • %code% setzt ein Flag %code% , so dass von nun an alle Zeilen berücksichtigt werden.
  • %code% Wenn das Flag %code% aktiv ist und die Zeile %code% enthält, wird die info.
  • ausgegeben
  • %code% deaktiviert das Flag, wenn %code% text gefunden wird.
___ qstntxt ___

Ich habe eine Log-Datei und ich benutze sed, um die Zeilen zwischen zwei Strings zu extrahieren, die das Wort MATCH enthalten. Ich benutze sed, um die Zeilen zu extrahieren, und grep, um nur die Zeilen aufzunehmen, die das Wort "MATCH" enthalten. Ich würde die Zeilennummer in der Protokolldatei benötigen, in der eine Übereinstimmung gefunden wird.

%Vor%

Ich verwende diesen Befehl, um die Zeilen zu extrahieren:

%Vor%

Meine Ausgabe ist:

%Vor%

Aber ich brauche auch in der Ausgabe die Zeilennummer:

%Vor%     
___ tag123grep ___ grep ist ein Befehlszeilen-Textsuchprogramm, das ursprünglich für Unix geschrieben wurde. Es verwendet reguläre Ausdrücke für die Textübereinstimmung und wird häufig als Filter in Pipelines verwendet. Verwenden Sie dieses Tag nur, wenn sich Ihre Frage auf die Programmierung mit grep- oder grep-basierten APIs bezieht. Fragen zur Verwendung oder Problembehandlung der Befehlszeilenoptionen von Grep selbst sind off-topic. ___ tag123sed ___ Sed (Stream EDitor) ist ein Befehlszeilen-Editor für die POSIX-Umgebung. Sed verarbeitet eine oder mehrere Dateien gemäß einem Editier-Skript und schreibt die Ergebnisse in die Standardausgabe. Es wurde in den Bell Labs entwickelt und existiert seit Mitte der 70er Jahre. Verwenden Sie dieses Tag nur, wenn sich Ihre Frage auf die Programmierung mit sed- oder sed-basierten APIs bezieht. Fragen zur Verwendung oder Problembehandlung von sed-Befehlszeilenoptionen selbst sind nicht Thema. ___ answer199999343 ___
%Vor%

Zeilennummer als der Zeileninhalt in der nächsten Zeile

%Vor%

für die Einbeziehung in die selbe Zeile (könnte in 1 sed getan werden, aber ein riesiges Skript und schlechte Leistung in diesem Fall, Ereignis mit einem Rückruf von Shell ist es einfacher mit einem zweiten sed). Könnte auch mit einer vorherigen Nummerierung der Zeile erfolgen

    
___ qstnhdr ___ sed und grep erhalten die Zeilennummer für eine Übereinstimmung ___
NeronLeVelu 15.11.2013 10:51
quelle
2

Mein erster Versuch war nicht, die Zeilennummer beizubehalten, weil der sed -Teil bestimmte Zeilen entfernt.

Alles kann mit diesem awk gemacht werden:

%Vor%
  • '/TST STARTS/ {p=1} setzt ein Flag p=1 , so dass von nun an alle Zeilen berücksichtigt werden.
  • p && /MATCH/ {print "line "NR" --> "p} Wenn das Flag MATCH aktiv ist und die Zeile /TST FINISHED/ {p=0} enthält, wird die info.
  • ausgegeben
  • TST FINISHED deaktiviert das Flag, wenn %code% text gefunden wird.
fedorqui 15.11.2013 10:34
quelle

Tags und Links