FastNetMon

Friday, 30 April 2010

Универсальный cat, zcat

Часто требуется грепать одновременно и сжатые посредством gz текстовые файлы (уже отротейченые) и одновременно обычные, не сжатые текстовые файлы.

Скажем, есть логи:

/var/www/xx/data/logs/xx.com.error.log
/var/www/yy/data/logs/yy.com.error.log
/var/www/zz/data/logs/yy.com.error.log


И рядом с ними еще ряд логов в формате gz:
/var/www/xx/data/logs/xx.com.error.log.0.gz
/var/www/yy/data/logs/yy.com.error.log.0.gz
/var/www/xx/data/logs/zz.com.error.log.0.gz


Задача - их надо отфильтровать посредством одного pipe канала, то есть чтобы и сжатые файлы и несжатые превратились в текст и были выана на stdout.

С gz все очевидно - их умеет выводить команда zcat. С текстовыми все также ясно как день - их выводит cat. Но как объединить этот функционал в одной команде? Очевидный вариант - попробовать вывести zcat ом текствовый файл:

Увы, это не сработает:
find /var/www/*/data/logs | egrep 'error.log$' | xargs cat | zcat
gzip: stdin: not in gzip format
xargs: cat: terminated by signal 13


Увы, я не нашел способа совместить функционал команд, но написал скрипт на баше для этого:
for i in `find /var/www/*/data/logs | grep 'error.log'`; do file $i | grep -q 'gzip compressed data'; if [ $? -eq 0 ]; then zcat $i ; else cat $i; fi ; done

3 comments :

  1. zcat -f xx.com.error.log xx.com.error.log.0.gz | grep ....
    Позволяет обойти gzip: stdin: not in gzip format

    ReplyDelete
  2. (cat /var/www/*/data/logs/*.log; zcat /var/www/*/data/logs/*.gz) | grep error

    ReplyDelete

Note: only a member of this blog may post a comment.