มีเครื่องมือที่รวม 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 ที่รองรับการอ่านจากไฟล์ที่ถูกบีบอัดและไม่มีการบีบอัดอย่างโปร่งใส แต่ manpage ไม่บอกว่าจะเทียบเท่ากับzcatgunzip -c


ขอบคุณสำหรับทางเลือกนี้ ฉันจะคิดอย่างนั้นได้ไหม ;) ... โอ้ดี จุดที่ +1 และยอมรับ (เพราะคุณมีตัวแทนน้อยกว่าผู้ตอบอื่น ๆ )
0xC0000022L

น่าอัศจรรย์ ช่วยฉันได้มากฉันใช้เชลล์สคริปต์เพื่อแก้ปัญหานี้มานานหลายปี ... หรือสคริปต์ Perl ที่แย่มาก ... ผสานการแก้ปัญหาบันทึกใช้โดย awstats ... ตอนนี้ฉันรู้เครื่องมือที่น่าอัศจรรย์นี้แล้ว ขอบคุณ
Luciano Andress Martini

98

ลองด้วย-fหรือ--force:

zcat -f -- *

เนื่องจากzcatเป็นเพียงสคริปต์ง่ายๆที่ทำงาน

exec gzip -cd "$@"

ด้วยตัวเลือกยาว ๆ ที่จะแปล

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

และตามman gzip(เน้นของฉัน):

-f - แรง
      บังคับการบีบอัดหรือคลายการบีบอัดแม้ว่าไฟล์นั้นจะมีหลายลิงค์
      หรือไฟล์ที่เกี่ยวข้องนั้นมีอยู่แล้วหรือถ้าข้อมูลที่บีบอัดอยู่
      อ่านหรือเขียนลงในเทอร์มินัล หากข้อมูลอินพุตไม่อยู่ในรูปแบบ
      ยอมรับโดย gzip และหากได้รับตัวเลือก --stdout ก็ให้คัดลอก
      ป้อนข้อมูลโดยไม่มีการเปลี่ยนแปลงมาตรฐานการส่งออก: ให้ zcat ประพฤติตัวเป็นแมว

นอกจากนี้:

เพื่อให้ฉันสามารถไพพ์เอาท์พุทgrepเป็นตัวอย่าง

คุณสามารถใช้zgrepสำหรับ:

zgrep -- PATTERN *

แต่เห็นความคิดเห็นของStéphaneด้านล่าง


1
ขอบคุณนั่นเป็นทางเลือกที่น่าสนใจในการzlessแก้ปัญหา ดีและ +1
0xC0000022L

6
โปรดทราบว่าทั้งสองzlessและzgrepเป็นสคริปต์ที่จะเรียกgzip -cdfq(นั่นคือzcat -fq)
Stéphane Chazelas

9

ฉันใช้เพื่อจุดประสงค์เดียวกันทุกประการ:

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

ฉันชอบวิธีนี้เพราะต้องใช้เวลาน้อยที่สุดในการสอนเพื่อนร่วมงาน หากข้อความบันทึกมีการประทับเวลาในการประทับเวลาที่เรียงลำดับสิ่งนี้มีประโยชน์อย่างยิ่ง
Thomas L Holaday

วิธีการที่ยอดเยี่ยม ขอบคุณ
MilošĐakonović

7

มีการแทนที่แบบหล่นในสำหรับ ztools (zcat, zgrep, .. ) ที่เรียกว่า zutils ซึ่งรวมเครื่องมือคลายการบีบอัดทั้งหมดโดยไม่ขึ้นกับแบ็กเอนด์ ดังนั้นด้วยคำสั่งเดียวกันคุณสามารถอ่านไฟล์ธรรมดา, lzma, gzipped, xz ได้อย่างโปร่งใส

มันมีอยู่ใน debian wheezy หรือใหม่กว่าอาจเป็น redhat / centos เกินไป

หน้าของโครงการอยู่ที่นี่nongnu.org

โพสต์บล็อกอธิบายการใช้งานของ util ที่นี่ ( 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 ... )
Vanni

จับดี. -v ควรแก้ไข
Ryan

ls -rvtacเพื่อหลีกเลี่ยงการ สำหรับล็อกไฟล์การตั้งค่า env var less $(ls -rv syslog*)ของคุณLESSOPENทำงานได้ดี คุณสามารถค้นหาไฟล์ด้วยesc-nเพื่อค้นหาคู่ที่ถัดไปโดยไม่สนใจขอบเขตไฟล์
Peter Cordes

ด้วยzsh:zcat -f syslog*(nOn)
Stéphane Chazelas

วิธีนี้ใช้ไม่ได้หากคุณตั้งค่าล็อกการหมุนของคุณเพื่อบีบอัดในวันถัดไป
cjbarth


0

คัดลอกและวาง (หรือวางไว้ที่ท้าย~/.bashrcไฟล์ของคุณ) ฟังก์ชันbashนี้:

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

ตอนนี้คุณสามารถพิมพ์ตัวอย่างlogs /var/log/syslogหรือlogs /var/log/nginx/access.logเพื่อดูทั้งหมดsyslogหรือNginxบันทึกข้อความจากเก่าไปใหม่ล่าสุดที่มีน้อย

จากนั้นคุณสามารถค้นหาสิ่งที่พิมพ์/somethingและกดปุ่มnสำหรับการต่อไป


0

มีสคริปต์ Perl ที่สวยงาม exacly ทำเช่นนี้ มันคือ logresolvemerge.pl จากโครงการ awstats: http://www.awstats.org/docs/awstats_tools.html

Logresolvemerge ช่วยให้คุณได้รับไฟล์บันทึกผลลัพธ์หนึ่งไฟล์เรียงลำดับตามวันที่สร้างจากแหล่งข้อมูลเฉพาะ:

  • สามารถอ่านไฟล์บันทึกได้หลายไฟล์
  • มันสามารถอ่านไฟล์บันทึก. gz / .bz2

    เอาต์พุตอยู่บน STDOUT เพื่อให้คุณสามารถใช้ประโยชน์ได้ค่อนข้างดีในกระบวนการเพิ่มเติม


  • 0

    สร้างคำตอบของ @ Ryan ต่อไปนี้จะได้รับไฟล์ 'roll' ทั้งหมดเรียงตามลำดับตัวอักษรจากนั้นรับไฟล์ปัจจุบันยกเลิกการบีบอัดไฟล์หากจำเป็นและ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คำชี้แจงเพื่อรองรับ

    โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
    Licensed under cc by-sa 3.0 with attribution required.