2012-11-23 5 views
5

का उपयोग कर फ़ाइल पथ के हिस्से को निकालने के लिए नियमित अभिव्यक्ति मैं नियमित अभिव्यक्तियों के लिए नया हूं लेकिन मुझे लगता है कि यहां लोग मुझे मूल्यवान इनपुट दे सकते हैं। मैं logstash grok फ़िल्टर का उपयोग कर रहा हूं जिसमें मैं केवल नियमित अभिव्यक्तियों की आपूर्ति कर सकता हूं।लॉगस्टैश ग्रोक फ़िल्टर

मैं इस

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

मैं रेगुलर एक्सप्रेशन का उपयोग करने के लिए स्ट्रिंग से sns882A हिस्सा है, जो तीसरे के बाद "/" सबस्ट्रिंग है प्राप्त करना चाहते हैं इस तरह की स्ट्रिंग, मैं यह कैसे कर सकते हैं?

मैं रेगेक्स तक ही सीमित हूं क्योंकि ग्रोक केवल रेगेक्स स्वीकार करता है। क्या इसके लिए रेगेक्स का उपयोग करना संभव है?

उत्तर

2
अपने regex के लिए

:

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

तुम भी साथ परीक्षण कर सकते हैं: http://www.regextester.com/

regex परीक्षक googling करके, आप विभिन्न यूआई हो सकता है।

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

संपादित:

+0

http: //www.regextester से।कॉम/यह मुझे कोई मैच नहीं देता है, मैंने कोशिश की है http://gskinner.com/RegExr/ कोई परिणाम भी नहीं ... – flyasfish

+0

यह समाधान निर्देशिका और फ़ाइल नामों पर हमेशा निर्भर करता है जिसमें हमेशा अल्फान्यूमेरिक वर्ण या अंडरस्कोर होते हैं। विशेष रूप से – Borodin

+0

पथ में कहीं भी रिक्त स्थान नहीं हो सकते हैं, यह मैच इंडेक्स 0 आधारित है। आप यह भी देख सकते हैं: 1: (sns882A), जिसका अर्थ है कि यह पहला मैच है। – junky

0

यह कैसे मैं पर्ल में यह करना होगा है अपने ढांचे पर्ल-ish गैर समूहीकरण समूह (?:xyz) का समर्थन नहीं करता है, तो यह regex के बजाय काम करना चाहिए:

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

आप .*? के प्रदर्शन के बारे में चिंतित हैं, यह रूप में अच्छी तरह से काम करता है:

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

एक और नोट: उपरोक्त सभी regexes स्ट्रिंग /app/webpf04/sns882A/ से मेल खाते हैं।

लेकिन मिलान करने वाली स्ट्रिंग पहले मिलान करने वाले समूह से पूरी तरह से अलग है, जो सभी तीन मामलों में sns882A है।

+0

जब मैं http://gskinner.com/RegExr/ पर^(?: /.*?) {2}/(। *?)/भाग का प्रयास करता हूं, तो यह/app/webpf04/sns882A/ – flyasfish

+0

से मेल खाता है क्या आपने कोशिश की यह पर्ल या पायथन में? मैंने किया, और यह – mvp

+0

काम करता है आपको '(?:/[^ /] *) 'का उपयोग करना चाहिए। अन्यथा आपका रेगेक्स यह तय करने के लिए * लंबा * समय ले सकता है कि यह – Borodin

0

आप वास्तव में पर्ल का उपयोग कर रहे हैं तो आप File::Spec मॉड्यूल इस

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

के लिए नहीं पूछा था, मैं किसी भी भाषा का उपयोग नहीं कर सकता, यह लॉगस्टैश-ग्रोक कॉन्फ़िगरेशन का हिस्सा है जिसमें मैं केवल अभिव्यक्तियों की आपूर्ति कर सकता हूं। – flyasfish

5

हाँ आप रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं कि आप क्या grok के माध्यम से चाहते हैं का उपयोग करना चाहिए:

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

मुझे पता है कि यह उत्तर बहुत देर हो चुकी है, लेकिन पहले * सही * उत्तर होने के लिए वैसे भी +1 है, यह एक स्टैंडअलोन रेगेक्स (कोई अन्य कोड और कोई डिलीमीटर नहीं है) जो उन हिस्सों के लिए नामित कैप्चर का उपयोग करता है जिन्हें निकालना है। –

0

वही जवाब लेकिन एक छोटे बग फिक्स। यदि आप प्रारंभ में^निर्दिष्ट नहीं करते हैं, तो यह अगले मैच के लिए जाएगा (इनपुट के लिए अधिक/जोड़ने वाले पथों को आजमाएं।)। इसे ठीक करने के लिए बस इस तरह से शुरू में^जोड़ें।^मतलब इनपुट लाइन से शुरू होता है। आखिरकार समूह 1 आपका जवाब है।

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

यदि आप नीचे दिए गए किसी भी यूआरआई पथ का उपयोग कर रहे हैं। (यह पथ को यूआरआई के रूप में भी संभालेगा)।

^.*?/[^/]+/[^/]+/([^/]+)/ 
संबंधित मुद्दे