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 grep
mit 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 grep
obigen Befehl die Option hinzufügen (ohne sie wird der Dateiname nur angezeigt, wenn mehr als eine Datei angegeben ist).
Der grep
Befehl 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
""