कुछ स्ट्रिंग वाली लाइनों के बिना फाइलें देखें


12

किसी प्रोग्राम के लिए खोज करना tailया lessजो मुझे एक निश्चित स्ट्रिंग वाले लाइनों के बिना मेरे लॉग देखने देता है। उदाहरण के लिए, UFW ( [UFW BLOCK]) प्रविष्टि लाइनों के बिना मेरे syslog देखें ।


हालांकि इस सुविधा के साथ अपने सटीक समस्या वर्णन का समाधान प्रदान करना आसान नहीं है, फिर भी आप यह जानना चाह सकते हैं कि lessरेगेक्स पैटर्न के बाद प्रदर्शित लाइनों को फ़िल्टर करने की संभावना प्रदान करता है। आप &पैटर्न के बाद टाइप करके इस सुविधा का उपयोग कर सकते हैं , और आप इसे &केवल टाइप करके वापस कर सकते हैं।
आरोन

जवाबों:


13

पैटर्न मैच उलट विकल्प -vके लिए grepइस बात के लिए वास्तव में उपयोगी है:

grep -v 'UFW BLOCK' /var/log/syslog

यह आपको उन सभी लाइनों को दिखाएगा जिनमें शामिल नहीं हैं UFW BLOCK। के रूप में grepडिफ़ॉल्ट रूप से उपयोग करता है बुनियादी नियमित अभिव्यक्ति, कोष्ठक के शामिल किए जाने यह अंतरिक्ष सहित 'UFW ब्लॉक' की अलग-अलग पात्रों में से किसी के लिए खोज कर देगा। आप शायद कोई आउटपुट नहीं देंगे। यदि आपको यह सुनिश्चित करने की आवश्यकता है कि स्ट्रिंग के चारों ओर ब्रैकेट हैं, तो या तो उनसे बच जाएं \[UFW BLOCK\], या केवल निश्चित स्ट्रिंग्स को शामिल करने के -Fविकल्प का उपयोग करें grep( इस पर सलाह के लिए Zanna और Steeldriver के लिए धन्यवाद ):

grep -Fv '[UFW BLOCK]' /var/log/syslog

आप आउटपुट को पेजर की तरह देख कर आसान बना सकते हैं less:

grep -v 'UFW BLOCK' /var/log/syslog | less

या बाद में देखने के लिए अपने घर निर्देशिका में एक फ़ाइल के लिए उत्पादन पुनर्निर्देशित:

grep -v 'UFW BLOCK' /var/log/syslog > ~/filtered_syslog

2
आप उस fgrepकमांड का भी उपयोग कर सकते हैं जो इसके बराबर है grep -F
ट्यूलेंस कोर्डोवा

2
@ TulainsCórdova grep के आदमी का कहना है कि "प्रत्यक्ष आह्वान या तो egrep या fgrep के रूप में पदावनत किया जाता है, लेकिन ऐतिहासिक अनुप्रयोगों की अनुमति देने के लिए प्रदान किया जाता है जो उन पर भरोसा करते हैं, जो अनमॉडिफाइड चलाते हैं"। मुझे नहीं पता कि क्या वे कभी इस पदावनति पर कार्रवाई करेंगे, लेकिन मुझे लगता है कि इन आदेशों का उपयोग करना सबसे अच्छा अभ्यास नहीं है
हारून

5

तुम भी उपयोग कर सकते हैं sedकी dधारा से पैटर्न के साथ लाइनों को हटाने के लिए आदेश:

sed '/\[UFW BLOCK\]/d' /var/log/syslog

हम []सामान्य रूप से बच निकलते हैं क्योंकि वे एक चरित्र वर्ग को दर्शाते हैं, जिसका अर्थ है "यहाँ अंदर कुछ भी मैच करें"


5

आप संपादन क्षमताओं के साथ किसी भी उपकरण का उपयोग कर सकते हैं। आपको पहले से ही समाधान का उपयोग कर दिया गया है grepऔर sed, यहां कुछ अन्य विकल्प हैं। इन सभी को आसानी से करने के लिए पहुंचाया जा सकता है lessया moreया कुछ और।

  1. पर्ल

    perl -ne 'print unless /\[UFW BLOCK\]/' /var/log/syslog
    

    चूँकि यह Perl, TIMTOWDI है!

    perl -pe '$_="" if /\[UFW BLOCK\]/' /var/log/syslog
    perl -ne '/\[UFW BLOCK\]/ || print' /var/log/syslog
    perl -ne 'print if !/\[UFW BLOCK\]/' /var/log/syslog
    perl -ne '!/\[UFW BLOCK\]/ && print' /var/log/syslog
    perl -ne '/\[UFW BLOCK\]/ ? "" : print' /var/log/syslog
    
  2. awk

    awk '!/\[UFW BLOCK\]/' file
    

2

आप भी उपयोग कर सकते हैं awk:

awk '!/PATTERN/' log

जब मैंने एक से अधिक "पैटर्न" प्राप्त किए हैं तो मैं इसका उपयोग करता हूं और मैं दो का उपयोग नहीं करना चाहता grep:

... | grep -v foo | grep -v bar

कौन सा वाक्यविन्यास है:

awk '!/PATTERN/ && !/PATTERN2/' log

"जब मैंने एक से अधिक" पैटर्न "प्राप्त किया है, तो मैं इसका उपयोग करता हूं और मैं दो grep जैसे" ------ का उपयोग नहीं करना चाहता हूं grep -Ev "foo|bar"?
α atsнιη

आप -eकई पैटर्न को परिभाषित करने के लिए भी उपयोग कर सकते हैं । grep -v -e 'foo' -e 'bar'
एरोनिकल जूल

@AFSHIN (पता नहीं कैसे मेरी टिप्पणी हटा दी जाती है), मेरा मतलब तार्किक और नहीं है?)
रवेक्सिना

1

lessकमांड के &विकल्प के साथ , नीचे के रूप में केवल वांछित मिलान पैटर्न प्रदर्शित करने के लिए फ़िल्टर करना संभव है,

& /PATTERN/

आपके मामले में अगर आप चाहते हैं कि फ़िल्टर लाइनें UFW BLOCKआउटपुट में प्रदर्शित न हों, तो आप बस &!नीचे दिए अनुसार उपयोग कर सकते हैं:

&! /UFW BLOCK/
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.