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.