zcat과 cat을 투명하게 결합하는 도구가 있습니까?


70

로그 파일을 처리 할 때 일부는 덕분에 zip 파일로 끝납니다 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하거나 사용 하는 도구가 있습니까?catgrep

NB : 스크립트를 작성할 수는 있지만 이미 도구가 있는지 묻고 있습니다.

답변:


41

zless

zcatlibz에는 압축 파일과 압축되지 않은 파일 모두를 투명하게 읽을 수있는 API가 있기 때문에 불쌍한 것 같습니다 . 그러나 맨 페이지는이 내용 zcat이에 해당 한다고 말합니다 gunzip -c.


이 대안에 감사드립니다. 나는 그것을 생각할 수 없었습니다. ;) ... 아 잘. 확인하고 +1하고 수락합니다 (다른 응답자보다 담당자 수가 적기 때문에).
0xC0000022L

놀랄 만한. 나에게 많은 도움을 주었다. 나는 몇 년 동안 쉘 스크립트를 사용하여 ... 또는 끔찍한 펄 스크립트를 사용했다. 감사.
Luciano Andress Martini

98

-f또는 함께 사용해보십시오 --force:

zcat -f -- *

이후 zcat실행되는 단순한 스크립트입니다

exec gzip -cd "$@"

긴 옵션으로 번역

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

그리고 man gzip(강한 광산)에 따라 :

-f-강제
      파일에 여러 링크가 있어도 강제 압축 또는 압축 해제
      또는 해당 파일이 이미 존재하거나 압축 된 데이터가
      터미널에서 읽거나 씁니다. 입력 데이터가 형식이 아닌 경우
      gzip에 의해 인식되고 --stdout 옵션도 제공되면
      표준 출력으로 변경하지 않고 입력 데이터 : zcat이 cat로 작동하도록합니다 .

또한:

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" ....

동료 교육에 소요되는 시간이 가장 짧기 때문에이 방법이 마음에 듭니다. 로그 메시지에 정렬하기 쉬운 타임 스탬프의 타임 스탬프가 있으면 특히 유용합니다.
토마스 엘 할러데이

탁월한 접근 방식. 감사.
Miloš Đakonović

7

zutils라는 ztools (zcat, zgrep, ..)를 백엔드와 독립적으로 모든 압축 해제 도구를 통합하는 드롭 인 대체품이 있습니다. 따라서 동일한 명령으로 일반, lzma, gzipped, xz 파일을 투명하게 읽을 수 있습니다.

데비안 wheezy 이상에서 사용할 수 있으며 아마도 redhat / centos에서도 가능합니다.

프로젝트 페이지는 여기 nongnu.org

util 사용법을 설명하는 블로그 게시물 ( noone.org )


3

이것은 zcat이 바이너리 인 RHEL 5.x에서 잘 작동합니다. zcat이 스크립트 인 RHEL 6.x (및 Ubuntu 12.x)에서는 실패합니다. 이 사용 잘 작동 할 수 있습니다.

zcat을 전혀 사용하지 않지만 zgrep은 압축되지 않은 파일도 제대로 처리하지 못합니다.


2

압축 및 비 압축을 시간순으로 엽니 다.

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

10 개 이상의 로그 파일 (syslog.10.gz ...)이 잘못된 순서로 표시됨
Vanni

잘 잡았습니다. -v이 문제를 해결해야합니다.
라이언

ls -rv피하기 위해 tac. 로그 파일의 경우, less $(ls -rv syslog*)당신과 LESSOPENENV var에 설정이 제대로 잘 작동합니다. esc-n파일 경계를 무시하고 다음 일치 항목을 찾기 위해 파일을 검색 할 수 있습니다 .
Peter Cordes

함께 zsh:zcat -f syslog*(nOn)
Stéphane Chazelas

당신이 당신의 로그가 다음 날을 압축 설정 회전있는 경우에 작동하지 않습니다
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

~/.bashrcbash 함수를 복사하여 붙여 넣거나 파일 끝에 붙여 넣으십시오 .

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

지금 당신은 예를 들어, 입력 할 수 있습니다 logs /var/log/syslog또는 logs /var/log/nginx/access.log보고 모든 시스템 로그 또는 Nginx와 함께 최신에 오래된에서 로그 메시지를 적은 .

그런 다음 검색 할 수 있습니다 뭔가 입력을 /something타격 n하기위한 다음 .


0

이 작업을 수행하는 아름다운 펄 스크립트가 있습니다. 다음은 awstats 프로젝트의 logresolvemerge.pl입니다. http://www.awstats.org/docs/awstats_tools.html

Logresolvemerge를 사용하면 특정 소스에서 빌드 된 날짜별로 정렬 된 고유 한 출력 로그 파일 하나를 얻을 수 있습니다.

  • 여러 입력 로그 파일을 읽을 수 있습니다
  • .gz / .bz2 로그 파일을 읽을 수 있습니다

    출력은 STDOUT에 있으므로 추가 프로세스에서 아주 잘 활용할 수 있습니다.


  • 0

    @Ryan의 대답을 바탕으로 다음은 모든 '롤링 된'파일을 알파벳순으로 정렬 한 다음 현재 파일을 가져 와서 필요한 경우 압축을 풀고 필요한 경우 압축을 풉니 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.