grep regex प्रतिरूप प्रत्येक पंक्ति पर मेल खाता है जहाँ केवल सभी मिलान दिखाई देते हैं और एक ही पंक्ति पर मुद्रित होते हैं


0

लॉग फ़ाइल से, प्रति पंक्ति कुछ पैटर्न निकालने की कोशिश कर रहा है। मैं पहली बार स्टैम्प और दो या तीन अन्य मैचों को निकालने की कोशिश कर रहा हूं, लेकिन मैं केवल उन लाइनों से मैच प्रिंट करने में सक्षम होना चाहता हूं जहां सभी मैच दिखाई देते हैं। क्या एक एकल grep कमांड है जिसे मैं इसके साथ कर सकता हूं, या क्या मुझे प्रत्येक पंक्ति के माध्यम से लूप करना है?

मेरी लॉग लाइन इस तरह है

2018-08-07 08:55:20 ERROR[t-dispatcher-24] - Error while processing message: code:[RequestTimeout], message:[{"from_addr_type": null, "transport_name": "999_abc_999_2_1", "in_reply_to": null, "group": null, "timestamp": "2018-08-07 07:55:19.795748", "from_addr": "341231231234", "message_type": "user_message", "helper_metadata": {}, "to_addr": "ABCD", "to_addr_type": null, "session_id": "157692", "content": "0013091779", "routing_metadata": {}, "message_version": "20110921", "transport_type": "XXXX", "provider": "abc_somewhere", "transport_metadata": {"abc_somewhere_XXXX": {"clientId": "XXXX157692", "starCode": "999", "session_id": "157692", "phase": "2", "dcs": "15", "requestId": "157692"}}, "session_event": "resume", "message_id": "5d9cab5353ff449783a737e8390a690b"}]

मैं शुरुआत में टाइमस्टैम्प जैसे कुछ समूहों, "सामग्री" और "to_addr" अनुभागों को निकालने में सक्षम होना चाहता हूं।

मैं इसके साथ आया: grep -oP '(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})|"to_addr":"\K(\d+)|"content":\K"(.+?)"' | tr -d '\n'

लेकिन Im केवल उन पंक्तियों का चयन करने में असमर्थ है जहां तीनों पैटर्न मैच मौजूद हैं। कृपया क्या मैं गलत कर रहा हूँ? क्या मैं बहुत अधिक अपेक्षा कर रहा हूं?

जवाबों:


0

आप |अपने पैटर्न के बीच एक का उपयोग कर रहे हैं , आप एक चाहते हैं।

अपने पैटर्न में, आप के लिए खोज कर रहे हैं "to_addr":"\K(\d+), लेकिन अपने उदाहरण मैं का मूल्य to_addrहै ABCDतो यह साथ मेल नहीं खाती \d+और जो जगह नहीं है "to_addr:और "ABCD", के लिए एक ही content

यदि to_addrपहले हमेशा होता है content:

grep -P '^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.*?"to_addr": "\d+.*?"content": ".+?"' 

अन्य उपयोग लुकहेड्स:

grep -P '^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}(?=.*?"to_addr": "\d+)(?=.*?"content": "(.+?)")' 

यदि आप केवल मैचों को प्रिंट करना चाहते हैं, तो मैं एक पर्ल-लाइनर का सुझाव देता हूं:

perl -ane 'print "$1\t$2\t$3\n" if (/^(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})(?=.*?"to_addr": "(\d+))(?=.*?"content": "(.+?)")/)' file

आपका बहुत बहुत धन्यवाद! यह मुझे पूरी तरह से लाइनों का चयन करने की अनुमति देता है, लेकिन मैं एक ही लाइन पर प्रत्येक पंक्ति से सिर्फ मैचों को कैसे प्रिंट कर सकता हूं?
सीनाओवॉलाबी

@ सिना: मेरा सुझाव है कि एक पर्ल वन-लाइनर का उपयोग करें, मेरा संपादन देखें।
टोटो

धन्यवाद! बहुत सुंदर वन-लाइनर! मैंने एक छोटी सी स्क्रिप्ट की: while IFS=' ' read -r line; do value0=$(echo "$line" | grep -oP '^(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})'); value1=$(echo "$line" |grep -oP '"to_addr":"\K(\d+)'); value2=$(echo "$line" | grep -oP '"content":"\K(.+?")'); printf "%s %s %s\n" "$value0" "$value1" "$value2"; done <source_file >> output_file लेकिन मैं हमेशा से ही आभारी हूं।
सिनाओवॉलबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.