Durchsuchen Sie Linux-Dateien, filtern Sie bestimmte Zeichenfolgen heraus und entfernen Sie alles andere

Durchsuchen Sie Linux-Dateien, filtern Sie bestimmte Zeichenfolgen heraus und entfernen Sie alles andere

Ich versuche, eine effiziente Möglichkeit zu finden, einen ganzen Satz von Dateien in einem Verzeichnis zu durchsuchen und dabei nur nach einer bestimmten Zeichenfolge bis zum ersten Komma zu suchen.

Beispiel der Postgres-Protokolldatei:

Apr 27 03:35:18 test postgres[24098]: [5-1] user=postgres,db=postgres,app=psqlclient=127.0.0.1
Apr 27 03:35:18 test postgres[24098]: [5-2] user=postgres,db=postgres,app=psqlclient=127.0.0.1 

Mich interessiert nur der in den Dateien verwendete Benutzername. Ich könnte pgbadger verwenden und es mir über HTML ansehen, aber das wäre ziemlich zeitaufwändig.

Als Beispiel könnte ich nur Folgendes sehen:

user=postgres

Im Gegensatz zum gesamten Textsatz vor und nach dem Benutzer.

Ich suche jedoch nach einem beliebigen Benutzer, nicht speziell nach Postgres.

Ich habe versucht, grep auf Dateien anzuwenden, sehe aber nur Ergebnisse für den Benutzer „postgres“.

Gibt es eine Möglichkeit, eine Reihe von Dateien beispielsweise bis zum ersten Komma nach „user=“ zu durchsuchen?

Oder sogar jede Datei durchsuchen und alles entfernen, was in jeder Zeile vor „user=“ steht. Das könnte ich dann vielleicht in Excel eingeben, um das gewünschte Ergebnis zu erhalten.

Jede Hilfe wird sehr geschätzt.

Antwort1

Benutzen GNU grepmit PCRE:

grep -Po -- '(?<=user=).+?(?=,)' *.log

user=Wenn Sie das Schlüsselwort zusätzlich anzeigen möchten :

grep -o -- 'user=[^,]*' *.log

Sie können sogar die Datei anzeigen, bei der die Übereinstimmung erfolgreich war, indem Sie -H dem grepobigen Befehl die Option hinzufügen (ohne sie wird der Dateiname nur angezeigt, wenn mehr als eine Datei angegeben ist).

Der grepBefehl lautet also:

grep -Ho -- 'user=[^,]*' *.log

Und die Ausgabe:

pgsql.log:user=postgres
pgsql.log:user=postgres

Antwort2

Verwendung von awk:

awk '/user=/{gsub(/^.*user=|,.*$/, "");print $0}' file

user=Wenn Sie einen Dateinamen anzeigen möchten , kann der Befehl geändert werden.

awk '/user=/{gsub(/^.*user=|,.*$/, "");
printf "%s:user=%s\n",FILENAME,$0}' *.log

Wenn in diesem Befehl etwas user=gefunden wird, ändert gsub()die Funktion, die die Zeichen vom Anfang des Datensatzes bis zum Ende des Datensatzes user=und das darauf folgende Komma nimmt, sie in eine leere Zeichenfolge ( ).user""

verwandte Informationen