पर्ल में लंबे वाक्यांशों के लिए नियमित अभिव्यक्तियां

मैं एक पर्ल स्क्रिप्ट में नियमित अभिव्यक्तियों का उपयोग करके निम्नलिखित पाठ से "खाता नाम" और "स्रोत नेटवर्क पता" निकालने के लिए देख रहा हूं। इस तरह के एक लंबे वाक्यांश के लिए एक नियमित अभिव्यक्ति जोड़ना, बहुत प्रयास करना प्रतीत होता है।

इसके लिए मुझे सबसे अच्छा रेगेक्स खोजने में आपकी मदद चाहिए, या किसी भी विचार से मदद मिलेगी। ध्यान रखें कि यह संभव 50 में से केवल 3 उदाहरण हैं? इस तरह के वाक्यांश (विभिन्न लंबाई)।

उदाहरण वाक्यांश 1:

WinEvtLog: Security: AUDIT_SUCCESS(4624): Microsoft-Windows-Security-Auditing: admin:     DOMAIN: hostname.domain.com: An account was successfully logged on. Subject:  Security ID:  S-1-0-0  Account Name:  -  Account Domain:  -  Logon ID:  0x0  Logon Type:   3      New Logon:  Security ID:  S-1-5-21-1130994204-1932287720-1813960501-1239  Account Name:  admin  Account Domain:  DOMAIN  Logon ID:  0x1d12cfff5  Logon GUID:  {AF5E2CF5-1A54-2121-D281-13381F397F41}  Process Information:  Process ID:  0x0  Process Name:  -  Network Information:  Workstation Name:   Source Network Address: 101.101.101.101  Source Port:  52616  Detailed Authentication Information:  Logon Process:  Kerberos  Authentication Package: Kerberos  Transited Services: -  Package Name (NTLM only): -  Key Length:  0  This event is generated when a logon session is created. It is generated on the computer that was accessed. 

उदाहरण वाक्यांश 2:

WinEvtLog: Security: AUDIT_SUCCESS(4634): Microsoft-Windows-Security-Auditing: admin: DOMAIN: hostname.domain.com: An account was logged off. Subject:  Security ID:  S-1-5-21-1130554204-1932287720-1813960501-4444  Account Name:  admin  Account Domain:  DOMAIN  Logon ID:  0x1d12d000a  Logon Type:   3  This event is generated when a logon session is destroyed. It may be positively correlated with a logon event using the Logon ID value. Logon IDs are only unique between reboots on the same computer."  4646,1

उदाहरण वाक्यांश 3:

WinEvtLog: Security: AUDIT_SUCCESS(540): Security: Administrator: HOST88: HOST88: Successful Network Logon:     User Name: Administrator        Domain:     HOST88      Logon ID:   (0x14,0x6E6FB948)       Logon Type: 3       Logon Process: NtLmSsp      Authentication Package: NTLM        Workstation Name: DESKHOST88        Logon GUID: -       Caller User Name: -     Caller Domain: -        Caller Logon ID: -      Caller Process ID: -        Transited Services: -       Source Network Address: 10.10.10.10     Source Port: 43221
0
@ बागोनी: वे सभी उपर्युक्त उदाहरण की तरह हैं।
जोड़ा लेखक GerogeGZ, स्रोत
क्या 1/2 रिक्त स्थान के अलावा प्रत्येक प्रकार के डेटा के बीच कोई डिलीमीटर है?
जोड़ा लेखक bagonyi, स्रोत
इस तरह का डेटा पार्स करने के लिए भयानक है। ऐसा लगता है कि ":" द्वारा सीमित कुंजी मान जोड़े, लेकिन यह असंगत है। कुछ मूल्यों में डिलीमीटर होता है और कुछ नहीं करते हैं और सीधे अगली कुंजी पर जाते हैं। यहां कोई भी समाधान सभी किनारे के मामलों को कवर करने की संभावना नहीं है।
जोड़ा लेखक jordanm, स्रोत

2 उत्तर

आप अपने समाधान के साथ कितना कठोर होना चाहते हैं?

यदि आपके पास लॉग लाइन हैं और "खाता नाम:" का अनुसरण करने वाले शब्द को निकालना चाहते हैं और "स्रोत नेटवर्क पता:" का अनुसरण करने वाला पता तो आप इसे इस तरह के एक बहुत ही बेवकूफ रेगेक्स के साथ कर सकते हैं:

my ($account_name) = /Account Name:\s+(\S+)/;
my ($source_network_addr) = /Source Network Address:\s+(\S+)/;

यह सत्यापित करने का प्रयास नहीं करता है कि लाइन में कुछ और है जैसा कि आप उम्मीद करते हैं, लेकिन यदि एप्लिकेशन केवल आईआईएस या जो कुछ भी उत्पन्न होता है, उसे पारदर्शी रेखाएं हैं, तो इसे वास्तव में सटीक होने की आवश्यकता नहीं हो सकती है।

0
जोड़ा
ओह। अच्छी पकड़।
जोड़ा लेखक Tim Pierce, स्रोत
यद्यपि यह प्रश्न में नहीं बताया गया है, "खाता नाम:" स्ट्रिंग में दो बार प्रकट होता है और मेरा मानना ​​है कि वह दूसरे के लिए मूल्य चाहता है।
जोड़ा लेखक jordanm, स्रोत

निम्नलिखित रेगेक्स आपके पोस्ट किए गए मामलों को संभाल लेंगे:

if ( $string =~ /(?<=Account Name:)\s+([^-\s]+).+(?:Source Network Address:)\s+([\d.]+)\s+/ ) {
    $account_name = $1;
    $source_addr = $2;
}
0
जोड़ा
पुष्टि समाधान धन्यवाद!
जोड़ा लेखक GerogeGZ, स्रोत