Скажем, есть логи:
/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
zcat -f xx.com.error.log xx.com.error.log.0.gz | grep ....
ReplyDeleteПозволяет обойти gzip: stdin: not in gzip format
Крутейше!!! Спасибо))
Delete(cat /var/www/*/data/logs/*.log; zcat /var/www/*/data/logs/*.gz) | grep error
ReplyDelete