क्या कोई ऐसा उपकरण है जो zcat और cat को पारदर्शी रूप से जोड़ता है?


70

लॉग फ़ाइलों को संभालते समय, कुछ अंत में gzipped फ़ाइलों के रूप में धन्यवाद logrotateऔर दूसरों को नहीं। तो जब आप कुछ इस तरह की कोशिश करते हैं:

$ zcat *

आप एक कमांड लाइन के साथ अंत करते हैं जैसे कि zcat xyz.log xyz.log.1 xyz.log.2.gz xyz.log.3.gzऔर फिर:

gzip: xyz.log: not in gzip format

वहाँ कैसे के लिए इसी तरह के एक उपकरण है कि जादू बाइट्स ले जाएगा, है fileकाम करता है, और प्रयोग zcatया catपरिणाम पर निर्भर करता है, ताकि मैं पाइप के उत्पादन कर सकते हैं grep, उदाहरण के लिए?

NB: मुझे पता है कि मैं इसे स्क्रिप्ट कर सकता हूं, लेकिन मैं पूछ रहा हूं कि क्या वहां पहले से ही एक उपकरण है।

जवाबों:


41

zless

यह अफ़सोस की बात है zcat, क्योंकि libz के पास एक API है जो संपीड़ित और असम्पीडित दोनों फ़ाइलों को पारदर्शी रूप से पढ़ने का समर्थन करता है। लेकिन मैनपेज कहता है कि zcatइसके बराबर है gunzip -c


इस विकल्प के लिए धन्यवाद। मैं ऐसा सोच सकता था, क्या मैं नहीं कर सकता था? ;) ... ओह अच्छा। +1 पर स्पॉट करें और स्वीकार करें (इसलिए भी कि आपके पास दूसरे उत्तरदाता की तुलना में कम प्रतिनिधि हैं)।
0xC0000022L

गजब का। मेरी बहुत मदद की, मैं वर्षों से हल करने के लिए शेल स्क्रिप्ट का उपयोग कर रहा था ... या एक भयानक पर्ल स्क्रिप्ट ... लॉग रिज़ॉल्यूशन मर्ज, awstats द्वारा उपयोग किया जाता है ... अब मुझे यह अद्भुत उपकरण पता है। धन्यवाद।
लुसियानो अंड्रेस मार्टिनी

98

इसके साथ प्रयास करें -fया --force:

zcat -f -- *

चूंकि zcatबस एक साधारण स्क्रिप्ट है जो चलती है

exec gzip -cd "$@"

लंबे विकल्पों के साथ जो अनुवाद करेगा

exec gzip --stdout --decompress "$@"

और, man gzip(जोर के अनुसार मेरा):

-फ --फोर्स
      यदि फ़ाइल में कई लिंक हैं, तो भी संपीड़न या विघटन को बल
      या संबंधित फ़ाइल पहले से मौजूद है, या यदि संकुचित डेटा है
      एक टर्मिनल से पढ़ा या लिखा गया। यदि इनपुट डेटा एक प्रारूप में नहीं है
      gzip द्वारा मान्यता प्राप्त है, और यदि विकल्प --stout भी दिया गया है, तो कॉपी करें
      मानक आउटपुट में परिवर्तन के बिना इनपुट डेटा: zcat बिल्ली के रूप में व्यवहार करते हैं

इसके अलावा:

ताकि मैं grepउदाहरण के लिए आउटपुट को पाइप कर सकूं

आप इसके लिए उपयोग कर सकते हैं zgrep:

zgrep -- PATTERN *

हालांकि स्टीफन की टिप्पणी नीचे देखें।


1
धन्यवाद, यह zlessसमाधान का एक दिलचस्प विकल्प है । अच्छा और +1।
0xC0000022L

6
ध्यान दें कि दोनों zlessऔर zgrepस्क्रिप्ट हैं जो कॉल करते हैं gzip -cdfq(जो है zcat -fq)।
स्टीफन चेज़लस

9

मैं बिल्कुल उसी उद्देश्य के लिए उपयोग करता हूं:

{ cat /var/log/messages ; zcat /var/log/messages*.gz ; }| grep something | grep "something else" ....

मुझे यह दृष्टिकोण पसंद है क्योंकि, इसे सहकर्मियों को शिक्षित करने में कम से कम समय की आवश्यकता होती है। यदि लॉग संदेश में एक सॉर्ट-फ्रेंडली टाइमस्टैम्प में टाइमस्टैम्प है, तो यह विशेष रूप से उपयोगी है।
थॉमस एल होलाडे

उत्कृष्ट दृष्टिकोण। धन्यवाद।
मिलोसा ovakonović

7

Zutools (zcat, zgrep, ..) के लिए एक ड्रॉप-इन प्रतिस्थापन है जिसे zutils कहा जाता है जो बैकएंड के सभी अपघटन उपकरण को स्वतंत्र रूप से एकजुट करता है। तो उसी कमांड से आप प्लेन, लज़मा, गज़पेड, एक्सज़ फाइल्स को पारदर्शी तरीके से पढ़ सकते हैं।

यह डेबियन व्हीज़ी या नए में उपलब्ध है, शायद रेडहैट / सेंटो में भी।

परियोजना का पृष्ठ यहाँ nongnu.org है

यहाँ उपयोग की व्याख्या करने वाला एक ब्लॉग पोस्ट ( noone.org )


3

यह RHEL 5.x में ठीक काम करता है जहाँ zcat एक बाइनरी है। यह RHEL 6.x (और Ubuntu 12.x) में विफल रहता है जहाँ zcat एक स्क्रिप्ट है। यह प्रयोग किया जाता है ठीक काम करने के लिए।

मैं सब पर zcat का उपयोग नहीं कर रहा हूँ, लेकिन zgrep ठीक से असम्पीडित फ़ाइलों को भी नहीं संभाल पायेगा।


2

कालानुक्रमिक क्रम में संकुचित और गैर-संपीड़ित दोनों को खोलता है।

ls -v syslog* | tac | xargs zcat -f | less

यह दस से अधिक लॉग फाइलों (syslog.10.gz ...) के साथ गलत आदेश देता है
वन्नी

अच्छी पकड़। -वो ठीक करना चाहिए।
रयान

ls -rvबचना tac। लॉग फ़ाइलों के लिए, less $(ls -rv syslog*)अपने LESSOPENenv var सेट के साथ ठीक से काम करता है। आप esc-nफ़ाइल सीमाओं को अनदेखा करते हुए, अगले मैच को खोजने के लिए फाइलों में खोज कर सकते हैं ।
पीटर कॉर्ड्स

साथ zsh:zcat -f syslog*(nOn)
स्टीफन चेज़ेलस

अगर आप अपने लॉग रोटेट सेट को अगले दिन सेक करने के लिए काम नहीं करते हैं
cjbarth

1

आवरण के बारे में क्या?

$ cat xcat.sh 
#!/bin/bash

for i in $@;do 
        [ ! -z "$(file -i $i | grep "gzip")" ] && zcat $i || cat $i
done

$ bash xcat.sh plain.txt gzipped_text.gz

0

कॉपी और पेस्ट (या अपने के अंत में डाल दिया ~/.bashrcफ़ाइल) इस पार्टी समारोह:

logs() { zcat -f $(ls -rv "$1"*) | less; }

अब आप उदाहरण के लिए टाइप कर सकते हैं logs /var/log/syslogया logs /var/log/nginx/access.logदेखने के लिए सभी syslog या nginx साथ नवीनतम करने के लिए सबसे पुराना से लॉग संदेशों कम

फिर आप अगले के लिए कुछ टाइपिंग /somethingऔर हिट खोज सकते हैं ।n


0

ऐसा करने के लिए एक सुंदर पर्ल स्क्रिप्ट है। यह awstats परियोजना से logresolvemerge.pl है: http://www.awstats.org/docs/awstats_tools.html

Logresolvemerge आपको एक विशेष आउटपुट लॉग फ़ाइल प्राप्त करने की अनुमति देता है, जो विशेष स्रोतों से निर्मित तिथि पर क्रमबद्ध होती है:

  • यह कई इनपुट लॉग फाइल को पढ़ सकता है
  • यह .gz / .bz2 लॉग फाइल पढ़ सकता है

    आउटपुट STDOUT पर है, ताकि आप इसे अतिरिक्त प्रक्रियाओं में अच्छी तरह से उपयोग कर सकें।


  • 0

    @ रयान के उत्तर पर निर्माण, निम्नलिखित में सभी 'लुढ़की' फाइलें वर्णानुक्रम में मिल जाएंगी, फिर वर्तमान फ़ाइल प्राप्त करें, यदि आवश्यक हो, और lessउन्हें:

    cat <(ls mylog.log-* | sort) <(ls mylog.log) | xargs zcat -f | less

    या यदि आप उन सभी को एक सतत स्ट्रीम के रूप में प्राप्त करना चाहते हैं, तो आप tailउन्हें, और वैकल्पिक रूप से एक अन्य प्रक्रिया में पाइप कर सकते हैं

    cat <(ls mylog.log-* | sort | xargs zcat -f) <(tail -f -n +0 mylog.log)

    मुझे ध्यान देना चाहिए कि यह लॉग के लिए डिज़ाइन किया गया है जो फ़ाइल के अंत में संलग्न तिथि के साथ दैनिक घुमाया जाता है। यदि आपका लॉग हमें एक अलग प्रारूप देता है, तो आपको catसमायोजित करने के लिए पहले भाग को संशोधित करना होगा ।

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