क्या पूंछ के उत्पादन को फ़िल्टर करना संभव है?


11

मैं एक फ़ाइल को पूँछना चाहता हूँ, लेकिन केवल आउटपुट लाइनें जो उनमें एक निश्चित स्ट्रिंग है। क्या यह संभव है?

जवाबों:


32

grep का उपयोग करें। इसका निर्माण सिर्फ उस उद्देश्य के लिए किया गया था।

/ Var / log / syslog की एक पूंछ से लाइनें खोजने के लिए जिसमें "क्रोन" है, बस चलाएं:

tail -f /var/log/syslog | grep cron

और चूंकि यह स्टड पर किसी भी चीज को स्वीकार करता है, आप इसे किसी भी अन्य कमांड के आउटपुट पर भी उपयोग कर सकते हैं, ऊपर के रूप में उसी तरह से पाइपिंग करके (उपयोग करते हुए | प्रतीक) |


8
हालांकि यह अनिवार्य रूप से सही है, यह महसूस करना महत्वपूर्ण है कि grepजब यह गैर-अंतःक्रियात्मक रूप से उपयोग किया जाता है, तो बफर होगा जब यह एक लंबी पाइपलाइन का हिस्सा होता है। GNU grep 2.5.1 --line-bufferedपाइपलाइन से grep को खत्म करने का विकल्प नहीं होने पर इसके आसपास काम करने का विकल्प प्रदान करता है । (जब मैं कहता हूं कि grep बफर होगा मेरा मतलब है कि आप आउटपुट को तब तक नहीं देखेंगे जब तक कि बफर 4k जैसी किसी चीज तक नहीं पहुंच जाता है।)
kojiro

पिछली टिप्पणी के पूरक के लिए, आधुनिक लिनक्स के तहत "टेल-एफ" एक लूप में काम करेगा, जो कि सिस्लॉग फ़ाइल में अधिक इनपुट की प्रतीक्षा कर रहा है। फ़ाइल के अस्तित्व सामग्री के साथ कमांड को वास्तव में समाप्त करने के लिए, -f स्विच को छोड़ दें: पूंछ / var / log / syslog | grep क्रोन
Gnudiff


4

यहां कुछ अन्य विचार दिए गए हैं, जो सरल नहीं होने पर, कुछ दिलचस्प अतिरिक्त लचीलापन प्रदान कर सकते हैं:

सबसे पहले, आप grep के बजाय awk से फ़िल्टर कर सकते हैं:

tail -f /var/log/messages | awk '/myfilterword/'

उदाहरण के रूप में उपयोग के रूप में बिल्कुल वैसा ही काम करता है grep। उदाहरण के लिए, awk की शक्ति का उपयोग करके आप इस पर विस्तार कर सकते हैं:

tail -f /var/log/messages | \
awk '/myfilterword/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n")}'

जो उत्पादन के अंतिम क्षेत्र के माध्यम से 6 को प्रिंट करेगा (फ़ील्ड व्हॉट्सएप अलग हो गए हैं)

एक अन्य समान विचार एक पर्ल वन-लाइनर का उपयोग करना है:

tail -f /var/log/messages | perl -ne "/myfilterword/ and print"

यह ठीक उसी तरह काम करता है grep। शायद आप एक लाइन नंबर काउंटर और सिर्फ 6 वां क्षेत्र चाहते हैं? इस बारे में कैसा है:

tail -f /var/log/messages | \ 
perl -lane "/myfilterword/ and printf \"%6d %s\n\",++\$a,\$F[6]"

जाहिर है कि इन सभी प्रकार की चीजों को अन्य उपकरणों के साथ भी किया जा सकता है, लेकिन मैं यह स्पष्ट करना चाहता था कि यहां कुछ सामान्य उद्देश्य भाषाओं जैसे कि awk या perl का उपयोग करने के कुछ मजेदार तरीके हैं।


कैसे grep से आगे विस्तार करने के लिए +1 महान विस्तार!
पाब्लो

2

ध्यान देने योग्य एक और चाल है, अगर आपके पास हेडर के साथ एक सीएसवी फ़ाइल है जिसे आप छोड़ना चाहते हैं, जैसे:

% cat data.txt
fruit        dessert        calories
Apple        Pie            770
Banana       Pudding        625
Cherry       Cobbler        990
% tail -n +2 data.txt
Apple        Pie            770
Banana       Pudding        625
Cherry       Cobbler        990

इससे कोई फर्क नहीं पड़ता कि इनपुट कितने समय के लिए tailहै, +n -2पहली पंक्ति को छोड़ देगा।

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