2012-11-23 16 views
5

Sono nuovo alle espressioni regolari ma penso che le persone qui possano darmi input preziosi. Sto usando il filtro logstash grok nel quale posso fornire solo espressioni regolari.Espressione regolare per estrarre parte di un percorso file utilizzando il filtro grok logstash

Ho una stringa come questa

/app/webpf04/sns882A/snsdomain/logs/access.log 

Voglio usare un'espressione regolare per ottenere la parte sns882A dalla stringa, che è la stringa dopo il terzo "/", come posso farlo?

Sono limitato a regex come grok accetta solo regex. È possibile usare regex per questo?

risposta

2

per la vostra regex:

/\w*\/\w*\/(\w*)\/ 

È inoltre possibile verificare con: http://www.regextester.com/

googling tester regex, si può avere diversa interfaccia utente.

+0

Da http: //www.regextester.non mi dà alcuna corrispondenza, ho provato http://gskinner.com/RegExr/ nessun risultato anche lì ... – flyasfish

+0

Questa soluzione si basa su nomi di directory e file sempre composti da caratteri alfanumerici o caratteri di sottolineatura. In particolare non ci possono essere spazi in qualsiasi punto del percorso – Borodin

+0

la corrispondenza è basata su indice 0. Puoi anche vedere: 1: (sns882A), che significa che è la prima partita. – junky

0

Questo è come vorrei farlo in Perl:

my ($name) = ($fullname =~ m{^(?:/.*?){2}/(.*?)/}); 

EDIT: Se il quadro non supporta Perl-ish gruppi non-raggruppamento (?:xyz), questa regex dovrebbe funzionare invece:

^/.*?/.*?/(.*?)/ 

Se siete preoccupati per le prestazioni di .*?, questo funziona così:

^/[^/]+/[^/]+/([^/]+)/ 

Un'altra nota: Tutte le espressioni regolari sopra corrispondono alla stringa /app/webpf04/sns882A/.

Ma la stringa corrispondente è completamente diversa dal primo gruppo corrispondente, ovvero sns882A in tutti e tre i casi.

+0

Quando provo^(:?? /.*) (.? *) {2}// parte su http://gskinner.com/RegExr/, è abbinato a/app/webpf04/sns882A/ – flyasfish

+0

hai provato in Perl o Python? L'ho fatto e funziona – mvp

+0

Dovresti usare '(?:/[^ /] *)'. Altrimenti la tua espressione regolare potrebbe richiedere un * lungo * tempo per decidere che non corrisponde a – Borodin

0

Se si sta infatti utilizzando Perl, allora si dovrebbe utilizzare il modulo File::Spec come questa uscita

use strict; 
use warnings; 

use File::Spec; 

my $path = '/app/webpf04/sns882A/snsdomain/logs/access.log'; 
my @path = File::Spec->splitdir($path); 

print $path[3], "\n"; 

sns882A 
+0

Non posso usare alcuna lingua, questo fa parte della configurazione di logstash-grok in cui posso fornire solo espressioni. – flyasfish

5

Sì, è possibile utilizzare espressioni regolari per ottenere quello che vuoi tramite Grok:

/[^/]+/[^/]+/(?<field1>[^/]+)/ 
+0

So che questa risposta è troppo tardi, ma +1 in ogni caso per essere la prima risposta * corretta * Cioè, una regex indipendente (nessun altro codice e nessun delimitatore) che usa l'acquisizione denominata per le parti che deve estrarre. –

0

La stessa risposta ma un piccola correzione di bug. Se non specifichi^in starting, andrà per la prossima partita (prova percorsi più lunghi aggiungendo più/per input.). Per risolvere il problema, aggiungi^all'inizio come in questo modo.^significa l'inizio della linea di input. infine group1 è la tua risposta.

^/[^/]+/[^/]+/([^/]+)/ 

Se si utilizzano i percorsi URI, utilizzare di seguito (gestirà percorso come URI).

^.*?/[^/]+/[^/]+/([^/]+)/ 
Problemi correlati