Löschen einiger Teile aus einer Protokolldatei

Löschen einiger Teile aus einer Protokolldatei

Ich möchte einen Teil einer Spalte löschen (7. Spalte:/user1/index...), sie ist durch ein Leerzeichen definiert. Dies ist ein Beispiel meiner Protokolldatei

192.xx.xxx - - [07/Apr/2017:14:21:15 +0200] "POST /user1/index.php?m=xxxxx&doajax=do_ajax_request&action=xxxx HTTP/1.1" ...
192.xx.x.xx - - [07/Apr/2017:14:21:15 +0200] "GET /user2/index.php?m=xxxxx&doajax=do_ajax_request&action=xxxxx HTTP/1.1".... 

Ich möchte einfach alle Benutzer löschen, also auch Benutzer1 und Benutzer2, weil ich nur die Anfrage analysieren möchte, egal, welche Benutzer das sind. So

192.xx.xxx - - [07/Apr/2017:14:21:15 +0200] "POST /index.php?m=xxxxx&doajax=do_ajax_request&action=xxxx HTTP/1.1" ...
192.xx.x.xx - - [07/Apr/2017:14:21:15 +0200] "POST /index.php?m=xxxxx&doajax=do_ajax_request&action=xxxxx HTTP/1.1".... 

Ich habe versucht, diesen Befehl nur zu verwenden, um die Anfrage zu extrahieren (/index.php?m=xxxx) cat /var/log/test.log| {print $7}'| awk -F/ '{print $3}', aber ich weiß nicht, wie ich diese Anfrage in der 7. Spalte ersetzen kann, wo ich meine Anfrage finden kann. Danke

Antwort1

sed 's,POST /[^/]*/,POST /,'  logfile | awk ... 

oder im awk-Skript, wenn Sie den Standardfeldtrenner (FS) verwenden

sub ("POST /[^/]*/", "POST /", $7) ; 

Antwort2

Sie können die folgende Sed-Option ausprobieren.

sed -i 's:/[a-zA-Z0-9]*/:/:2' logfile

Hierbei wird nach einem Muster gesucht, das mit „/“ beginnt, Buchstaben und Zahlen (für den Benutzernamen) enthält und mit „/“ endet. Dieses wird in jeder Zeile der Datei durch nur „/“ ersetzt.

Oder

sed -i 's: /[a-zA-Z0-9]*/:/:2' logfile

Der einzige Unterschied zum ersten Befehl besteht darin, dass auch das Leerzeichen vor dem ersten /user* in der Zeile berücksichtigt wird.

verwandte Informationen