एक मिलान पैटर्न के बाद केवल एक पंक्ति के हिस्से को वापस करें


109

तो एक फ़ाइल को खोलने के साथ खींचना catऔर फिर grepमिलान लाइनों को प्राप्त करने के लिए उपयोग करना मुझे केवल तब तक मिलता है जब मैं उस विशेष लॉग सेट के साथ काम कर रहा हूं जिसके साथ मैं काम कर रहा हूं। इसे लाइनों को एक पैटर्न से मिलान करने का एक तरीका चाहिए, लेकिन केवल मैच के बाद लाइन के हिस्से को वापस करने के लिए। मैच से पहले और बाद का हिस्सा लगातार अलग-अलग होगा। मैंने उपयोग करने के साथ खेला है sedया awk, लेकिन यह पता लगाने में सक्षम नहीं है कि मैच से पहले के हिस्से को हटाने के लिए लाइन को कैसे फ़िल्टर किया जाए, या मैच के बाद का हिस्सा वापस किया जाए, या तो काम करेगा। यह एक पंक्ति का एक उदाहरण है जिसे मुझे फ़िल्टर करने की आवश्यकता है:

2011-11-07T05:37:43-08:00 <0.4> isi-udb5-ash4-1(id1) /boot/kernel.amd64/kernel: [gmp_info.c:1758](pid 40370="kt: gmp-drive-updat")(tid=100872) new group: <15,1773>: { 1:0-25,27-34,37-38, 2:0-33,35-36, 3:0-35, 4:0-9,11-14,16-32,34-38, 5:0-35, 6:0-15,17-36, 7:0-16,18-36, 8:0-14,16-32,34-36, 9:0-10,12-36, 10-11:0-35, 12:0-5,7-30,32-35, 13-19:0-35, 20:0,2-35, down: 8:15, soft_failed: 1:27, 8:15, stalled: 12:6,31, 20:1 }

मुझे जिस भाग की आवश्यकता है वह "ठप" होने के बाद सब कुछ है।

इसके पीछे पृष्ठभूमि यह है कि मैं यह पता लगा सकता हूं कि कितनी बार कुछ स्टाल हैं:

cat messages | grep stalled | wc -l

मुझे क्या करने की आवश्यकता है यह पता लगाने के लिए कि कितनी बार एक निश्चित नोड ठप हो गया है ("कॉल को रोकने के बाद प्रत्येक बृहदान्त्र से पहले भाग द्वारा इंगित किया गया है।) यदि मैं सिर्फ उसके लिए जीआरपी (यानी 20 :) यह लाइनों को वापस कर सकता है जिसमें नरम विफल रहता है, लेकिन कोई स्टाल नहीं है, जो मेरी मदद नहीं करता है। मुझे केवल रुके हुए हिस्से को फ़िल्टर करने की आवश्यकता है ताकि मैं उन विशिष्ट नोड के लिए जीआरपी कर सकूं, जो बंद हो गए हैं।

सभी इरादों और उद्देश्यों के लिए, यह मानक GNU कोर बर्तनों के साथ एक नि: शुल्क प्रणाली है, लेकिन मैं सहायता के लिए कुछ भी अतिरिक्त स्थापित नहीं कर सकता।


@ गिल्स, अजीब है कि जब मैंने खोजा तो वह पॉप अप नहीं हुआ था, हालांकि मैंने उस शीर्षक का उपयोग नहीं किया था जो मैं अंततः साथ गया था ... लेकिन यह मेरे शीर्षक के नीचे स्क्रीन में नहीं दिखा। वैसे भी, यह एक तरफ, वह मुझे मिल सकता है जहां मैं चाहता हूं, हालांकि मुझे मैच के बाद पूरी लाइन की आवश्यकता है, पहला शब्द नहीं - लेकिन शायद बहुत बदलाव न हो।
MaQleod

इसका शीर्षक चूसा। मैंने तुम्हारा चुरा लिया है जो बहुत अच्छा है। sedसमाधान ले लो और विशेष रूप से व्हाट्सएप का इलाज न करें।
गाइल्स

@ गिल्स, यह कुछ ऐसा है जो मुझे पूरी तरह से यकीन नहीं है कि कैसे करना है। मैं अभी भी sed सीख रहा हूँ।
MaQleod


1
@ shaa0601 मैं आपके प्रश्न को नहीं समझता हूँ, बिना किसी प्रारूपण के टिप्पणी में अनुसरण करना विशेष रूप से कठिन है। एक नया, स्व-निहित प्रश्न पूछें।
गिल

जवाबों:


141

उस के लिए विहित उपकरण होगा sed

sed -n -e 's/^.*stalled: //p'

विस्तृत विवरण:

  • -n इसका मतलब है कि डिफ़ॉल्ट रूप से कुछ भी प्रिंट न करें।
  • -e इसके बाद एक sed कमांड होती है।
  • s पैटर्न रिप्लेसमेंट कमांड है।
  • नियमित अभिव्यक्ति आपके द्वारा ^.*stalled:खोजे जा रहे पैटर्न से मेल खाती है, साथ ही किसी भी पूर्ववर्ती पाठ ( .*किसी भी पाठ का अर्थ है, ^यह कहने के लिए कि इस पंक्ति की शुरुआत में मैच शुरू होता है)। ध्यान दें कि यदि stalled:लाइन पर कई बार होता है, तो यह अंतिम घटना से मेल खाएगा।
  • मैच, अर्थात लाइन अप करने के लिए सब कुछ stalled:, खाली स्ट्रिंग (हटाए गए) द्वारा प्रतिस्थापित किया जाता है।
  • अंतिम का pअर्थ है परिवर्तित रेखा को मुद्रित करना।

यदि आप मिलान वाले हिस्से को बनाए रखना चाहते हैं, तो एक बैकरेन्स का उपयोग करें: \1प्रतिस्थापन भाग में यह दर्शाता \(…\)है कि पैटर्न में समूह के अंदर क्या है । यहाँ, आप stalled:फिर से प्रतिस्थापन भाग में लिख सकते हैं ; यह सुविधा तब उपयोगी है जब आप जिस पैटर्न की तलाश कर रहे हैं वह एक साधारण स्ट्रिंग की तुलना में अधिक सामान्य है।

sed -n -e 's/^.*\(stalled: \)/\1/p'

कभी-कभी आप मैच के बाद लाइन के हिस्से को हटाना चाहेंगे। आप इसे .*$पैटर्न के अंत में शामिल कर सकते हैं ( .*पंक्ति के अंत के बाद कोई भी पाठ $)। जब तक आप उस हिस्से को एक समूह में नहीं रखते हैं जिसे आप प्रतिस्थापन पाठ में संदर्भित करते हैं, तो पंक्ति का अंत आउटपुट में नहीं होगा।

समूहों और backreferences के एक और चित्रण के रूप में, यह कमांड मैच से पहले और मैच के बाद के भाग को स्वैप करता है।

sed -n -e 's/^\(.*\)\(stalled: \)\(.*\)$/\3\2\1/p'

मैंने पहले दो उदाहरणों की कोशिश की है और यह सिर्फ लटका हुआ लगता है। मुझे एक त्रुटि संदेश नहीं मिलता है, और न ही मुझे एक नया संकेत मिलता है, बस कुछ नहीं।
MaQleod

2
@MaQleod ओह, यह मानक इनपुट पर इनपुट की प्रतीक्षा कर रहा है, जो यहां टर्मिनल है क्योंकि आपने इसे पुनर्निर्देशित नहीं किया है। sed … <messagesजब आप किसी फ़ाइल से डेटा संसाधित करना चाहते हैं, तो आप एक इनपुट पुनर्निर्देशन करेंगे। किसी अन्य कमांड द्वारा निर्मित डेटा पर कार्य करने के लिए, आप एक पाइप का उपयोग करेंगे somecommand | sed …:।
गिल्स 1

1
दाईं ओर, काला दिन समाप्त होता है। कमांड पूरी तरह से काम करता है, धन्यवाद।
MaQleod

1
सबसे अच्छा sed स्पष्टीकरण मैंने अब तक देखा है - धन्यवाद!
जॉन वड्सवर्थ

1
क्या @ बंगलाकार छोटा संस्करण? यह मेरे जवाब में किसी भी कमांड के बराबर नहीं है। मैं इसे लिखने की सलाह दूंगा sed 's/^.*stalled//'क्योंकि यह -rलिनक्स के लिए विशिष्ट है और अन्य प्रणालियों जैसे कि macOS पर काम नहीं करता है और यहां आपको इसका कोई लाभ नहीं मिल रहा है।
गाइल्स

72

अन्य विहित उपकरण जो आप पहले से ही उपयोग करते हैं grep:

उदाहरण के लिए:

grep -o 'stalled.*'

गिल्स के दूसरे विकल्प के समान परिणाम है:

sed -n -e 's/^.*\(stalled: \)/\1/p'

-oझंडा रिटर्न --only-matchingनिश्चित रूप से - - सामान्य रूप से ग्रेप द्वारा किया अभिव्यक्ति का हिस्सा है, इसलिए नहीं पूरी पंक्ति जो है।

आउटपुट से "रुका हुआ:" निकालने के लिए, हम तीसरे विहित उपकरण का उपयोग कर सकते हैं, कट:

grep -o 'stalled.*' | cut -f2- -d:

cutआदेश सीमांकक का उपयोग करता है :अंत तक और प्रिंट क्षेत्र 2। यह निश्चित रूप से प्राथमिकता की बात है, लेकिन cutवाक्यविन्यास मुझे याद रखना बहुत आसान लगता है।


1
-oविकल्प का उल्लेख करने के लिए धन्यवाद ! मैं इंगित करना चाहता था कि एक नई grepरेखा के \nरूप में पहचान नहीं है , इसलिए आपका पहला उदाहरण केवल पहले nचरित्र से मेल खाता है । उदाहरण के लिए, echo "Hello Anne" | grep -o 'A[^\n]*'स्ट्रिंग लौटाता है A। हालाँकि, echo "Hello Anne" | grep -o 'A.*'अपेक्षित रिटर्न देता है Anne, क्योंकि .न्यूलाइन को छोड़कर किसी भी चरित्र से मेल खाता है।
अदमलार

1
ध्यान दें कि cutसीमांकक के आसपास के उद्धरण -d':'@poige द्वारा हटा दिए जाते हैं। मुझे उद्धरणों के साथ याद रखना आसान है, उदाहरण के लिए -d' 'या के साथ -d';'
ऐनी वैन रोसुम

आपकी खोज के अनुसार उद्धरणों का -f 2भी उपयोग करना याद रखना आसान होना चाहिए । गंभीरता से, क्यों नहीं?
16

क्योंकि एक उपनिवेश जैसे एक अर्ध-बृहदान्त्र के ;बजाय एक बृहदान्त्र :की व्याख्या की जाएगी यदि उद्धृत नहीं किया गया है। बेशक यह तार्किक व्यवहार है, लेकिन फिर भी मुझे मांसपेशियों की स्मृति पर भरोसा करना पसंद है। मुझे एक बार परिसीमनकर्ता को उद्धृत करना पसंद नहीं है लेकिन दूसरी बार नहीं। बस व्यक्तिगत पसंद, जैसा मैंने पहले कहा था: याद रखना आसान है।
ऐनी वैन रोसुम

वह अवधि जो .*आवश्यक है, मेरे लिए अच्छी तरह से काम की है: cat filename | grep 'Return only this line xyz text' | grep -o 'xyz.*' रिटर्नxyz text
रॉन

4

मैं ifconfig | grep eth0 | cut -f3- -d:इसे लेता था

    [root@MyPC ~]# ifconfig
    eth0  Link encap:Ethernet  HWaddr AC:B4:CA:DD:E6:F8
          inet addr:192.168.0.2  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:78998810244 errors:1 dropped:0 overruns:0 frame:1
          TX packets:20113430261 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:110947036025418 (100.9 TiB)  TX bytes:15010653222322 (13.6 TiB)

और इसे इस तरह देखो

    [root@MyPC ~]# ifconfig | grep eth0 | cut -f3- -d:
    C4:7A:4D:F6:B8

2
क्या यह सवाल का जवाब देता है?
स्टीफन राउच

1
आप उपयोग कर सकते हैं cat /sys/class/net/*/address, कोई पार्सिंग की आवश्यकता नहीं है।
ऐनी वैन रोसुम

1

फिर भी एक अन्य विहित उपकरण जिसे आप awkनिम्न पंक्ति के साथ उपयोग कर सकते हैं:

awk -F"stalled" '/stalled/{print $2}' messages

विस्तृत विवरण:

  • -Fलाइन के लिए एक विभाजक को परिभाषित करता है, अर्थात, "रुका हुआ"। विभाजक के साथ सब कुछ पहले $1और सब कुछ के साथ संबोधित किया जाता है $2
  • /reg-ex/ इस मामले में "रूकी हुई" मिलान वाली नियमित अभिव्यक्ति के लिए खोजें।
  • {print $<n>}- प्रिंट एन कॉलम। चूंकि आपके विभाजक को स्टेल्ड के रूप में परिभाषित किया गया है, स्टाल किए जाने के बाद का सब कुछ दूसरा कॉलम माना जाता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.