2016-12-27 2 views
-3

Ich habe ein Protokoll, das wie dies bekam:Extrahierung Schlüsselwort aus einer Protokollzeile

.....client connection.....remote=/xxx.xxx.xxx.xxx]]....... 

Ich brauche alle Zeilen im Protokoll zu extrahieren, welche die oben enthalten und druckt nur die ip nach remote=.. Dies würde etwas im Muster sein:

grep "client connection" xxx.log | sed -e .... 
+2

Was haben Sie versucht? Die meisten von uns hier sind glücklich, Ihnen zu helfen, Ihr Handwerk zu verbessern, aber sind weniger glücklich, als kurze Bestellung unbezahlte Programmierer zu handeln. Zeigen Sie uns Ihre bisherige Arbeit in einem [MCVE] (http://stackoverflow.com/help/mcve), dem Ergebnis, das Sie erwartet haben, und den Ergebnissen, die Sie erhalten haben, und wir werden Ihnen helfen, es herauszufinden. – ghoti

+0

Mögliches Duplikat von [Muster aus einer Zeichenkette extrahieren] (http://stackoverflow.com/questions/11533063/extract-pattern-from-a-string) – tripleee

+1

Benutzer mit einer Wiederholungszahl von 2K sollten jetzt wissen, dass sie nicht [fragen] Freiwillige für die Dringlichkeit] (http://meta.stackoverflow.com/q/326569/472495). – halfer

Antwort

0
grep -oP 'client connection.*remote=/\K.*?(?=])' input 

Drucke etwas zwischen remote=/ und am nächsten ] auf den Linien, die client connection enthalten.

Oder durch sed zurück mit Referenzierung: Hier wird die Linie in drei Teile/Gruppen unterteilt ist, die später von \1\2 oder \3 bezeichnet werden. Jede Gruppe wird von ( und ) umschlossen. Hier gehört die IP-Adresse zur 2. Gruppe, also wird die ganze Zeile durch die 2. Gruppe ersetzt, die IP-Adresse ist.

sed -r '/client connection/ s_(^.*remote=/)(.*?)]](.*)_\2_g' input 

Oder awk mit:

awk -F'/|]]' '/client connection/{print $2}' input 
0

Versuchen Sie folgendes:

grep 'client connection' test.txt | awk -F'[/\\]]' '{print $2}' 

Testfall

test.txt 
--------- 
abcd 
.....client connection.....remote=/10.20.30.40]]....... 
abcs 
.....client connection.....remote=/11.20.30.40]]....... 
.....client connection.....remote=/12.20.30.40]]....... 

Ergebnis

10.20.30.40 
11.20.30.40 
12.20.30.40 

Erklärung

grep werden die Ergebnisse nur Linien Auswahl passende Client-Verbindung. awk verwendet -F Flag für Trennzeichen, um Text zu teilen. Wir bitten awk/ und Trennzeichen zu verwenden, um Text zu teilen. Um mehr als ein Trennzeichen zu verwenden, setzen wir die Trennzeichen in [ und ]. Um beispielsweise Text nach = und : zu teilen, machen wir [=:].

jedoch in unserem Fall eine der Begrenzungszeichen ist ] da meine Absicht IP ist speziell zu extrahieren aus /x.x.x.x] durch den Text mit / und ] spucken. So entkommen wir ihm ]. Die IP ist der 2. Punkt aus dem Splitting.

1

Mit grep:

grep -oP '(?<=remote=/)[^\]]+' file 

o ist nur um das Muster zu extrahieren, statt der gesamten Linie. P ist Perl wie Regex zu entsprechen. In diesem Fall verwenden wir "negativen Blick hinter". Er wird versuchen, eine Gruppe von Merkmalen zu entsprechen, die nicht „]“ ist die von remote=/

+1

Ein robusterer Weg wäre, das Muster 'client connection' in' grep' zu integrieren, da dies OP benötigt. Zu Ihrer Logik gehören möglicherweise auch Zeilen, die in derselben Zeile keine Clientverbindung haben. – Inian

0

Eine robustere Art und Weise, verbesserte sich gegenüber this answer auch GNU grep in PCRE Modus mit -P für perl Stil regEx Spiel verwenden würde vorausgeht, aber passende beide Muster wie in der Frage vorgeschlagen. Hier

grep -oP "client connection.*remote=/\K(\d{1,3}\.){3}\d{1,3}" file 
10.20.30.40 
11.20.30.40 
12.20.30.40 

, client connection.*remote Matches sowohl die Muster in den Leitungen und extrahiert IP aus der Datei. Die \K ist eine PCRE Syntax, um bis zu diesem Punkt Zeichenfolgen zu ignorieren und nur die darauf folgende Erfassungsgruppe zu drucken.

(\d{1,3}\.){3}\d{1,3} 

Um die IP d.h. 3 Gruppen von Ziffern, die durch Punkte von der Länge von 1 zu 3 gefolgt von 4th Oktett getrennt übereinstimmen.

0

awk verwenden: Könnten Sie bitte versuchen Sie es uns nach und lassen Sie wissen, wie es geht dann.

awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/);if(substr($0,RSTART,RLENGTH)){print substr($0,RSTART,RLENGTH)}}' Input_file 
Verwandte Themen