2013-02-18 10 views
7

Próbuję utworzyć skrypt dla plików logów znajdujących się w/var/log /. Jestem w stanie albo odzyskać nieskompresowane logi, albo skompresowane logi (w wyniku rotacji logów), ale nie udało mi się wykonać obu w jednym poleceniu (gdy próbuję to zrobić, otrzymuję "plik binarny (standardowe wejście)"), czy można zrobić coś takiego? dzięki!Czy mogę pomieszać zarówno skompresowane pliki, jak i nieskompresowane pliki, używając tego samego polecenia:

+0

@StevenPenny .gz i tak na przykład syslog, syslog.1, syslog.2.gz, syslog.3.gz i tak dalej – lacrosse1991

Odpowiedz

6

spróbować zrobić to za pomocą funkcję:

greplog() { 
    cd /var/log 
    { 
     cat $1 $1.*[0-9] 
     zcat $1.*.gz 
    } | grep "$2" 
} 

Zastosowanie:

$ greplog syslog pattern 
+1

działało idealnie, dzięki! – lacrosse1991

+0

Aby być spójnym z grep i innymi, czy nie byłoby lepiej mieć "syslog" typu greplog? – hbogert

7

zgrep może zrobić dla ciebie, obsługuje zarówno pliki skompresowane i nieskompresowane. Jedną wadą jest to, że nie może traktować katalogów rekursywnie. Ale w przypadku Twojej instancji jest w pełni wystarczająca i możesz filtrować np. syslog następująco:

$ zgrep PATTERN /var/log/syslog* 
1

xzgrep jest one stop shop dla powszechnie skompresowanych plików, przynajmniej na Ubuntu 10.12 16 i MacOS (zainstalowany z XZ od DarwinPorts). Od strony man: xzgrep invokes grep(1) on files which may be either uncompressed or compressed with xz(1), lzma(1), gzip(1), or bzip2(1).

Usage (uwaga -r nie jest obsługiwany):

$ find . -type f | parallel -j4 'xzgrep -Hn "PATTERN" {}'