Bash-Sub-String-Extraktion für das angegebene Start- und Endzeichen

7

Zum Beispiel habe ich eine Protokolldatei mit diesem Eintrag:

[Mi Aug 08 11:39:41 2012] [Fehler] [Client 155.94.70.224] ModSecurity: [Datei "/etc/httpd/modsecurity.d/rules/base_rules/modsecurity_crs_20_protocol_violations.conf"] [Zeile "271"] [ id "960020"] [rev "2.2.5"] [msg "Pragma-Header erfordert Cache-Control-Header für HTTP / 1.1-Anforderungen."] [Schweregrad "NOTICE"] [Tag "RULE_MATURITY / 5"] [Tag "RULE_ACCURACY / 7 "] [tag" https://www.owasp.org/index.php/ModSecurity_CRS_RuleID-960020 "] [tag" PROTOCOL_VIOLATION / INVALID_HREQ "] [tag" http://www.bad-behavior.ioerror.us/ Dokumentation / Funktionsweise / "] Warnung. String-Übereinstimmung "HTTP / 1.1" bei REQUEST_PROTOCOL. [Hostname "webmail.white-art.co.uk"] [uri "/ horde / themes / graphics / tree / plusonly.

Ich möchte alle Zeichenfolgenpaare extrahieren, die mit dem Zeichen beginnen [und mit enden ]. Ich kann cut oder awk verwenden, um mit einem einzelnen Trennzeichen zu extrahieren, aber ich muss eine Zeichenfolge zwischen Anfang [und Ende extrahieren ]. wie man es erreicht?

Zum Beispiel muss ich extrahieren:

"[Tag" RULE_ACCURACY / 7 "]"

und

"[Schweregrad" HINWEIS "]"

aus dem Protokoll.


Ich habe eine Lösung gefunden, bei der ich zuerst das Protokoll auflösen muss, indem ich nach jeder Zeile eine neue Zeile hinzufüge ]und dann mit grep nach der erforderlichen Zeichenfolge suche. Gibt es einen besseren Weg, dies zu tun?

Farhan
quelle

Antworten:

10

Ich denke, das wird die Linie teilen, wie Sie wollen

sed -e 's/\]/\]\n/g' log | sed -e 's/^ *//g' | awk '/^\[/ {print}'

Fügen Sie nach jeder Zeile eine neue Zeile ein, entfernen Sie ]dann alle führenden Leerzeichen und drucken Sie schließlich die Zeilen, die mit beginnen [.

Ihre Eingabezeile wird

[Wed Aug 08 11:39:41 2012]
[error]
[client 155.94.70.224]
[line "271"]
[id "960020"]
[rev "2.2.5"]
[msg "Pragma Header requires Cache-Control Header for HTTP/1.1 requests."]
[severity "NOTICE"]
[tag "RULE_MATURITY/5"]
[tag "RULE_ACCURACY/7"]
[tag "https://www.owasp.org/index.php/ModSecurity_CRS_RuleID-960020"]
[tag "PROTOCOL_VIOLATION/INVALID_HREQ"]
[tag "http://www.bad-behavior.ioerror.us/documentation/how-it-works/"]
[uri "/horde/themes/graphics/tree/plusonly.png"]
[unique_id "UCJB7VveCGYAAG@BHJgAAAAQ"]
user9517
quelle
9

Dieser eine Befehl macht, was Sie wollen:

grep -o '\[[^]]*\]' inputfile
Bis auf weiteres angehalten.
quelle