Debe usar gtar, generalmente viene preinstalado con el paquete SUNWgtar:
gzip -dc gcc-4.9.0.tar.gz | /usr/sfw/bin/gtar -xf -
echo $?
0
El tar nativo de Solaris sin parches puede tener problemas con los archivos creados con GNU tar. Ver respuesta de @schily por qué.
Самый простой способ записать это дополнительное условие — просто передать вывод через другой вызов grep
перед записью в файл:
find /var/logs/syslog -name \* -print0 | xargs -0 -n 1 -P 36 zgrep -f foo.txt | grep -v Duplicate > /tmp/bar.txt
Производительность выполнения этого в отдельном однопоточном -процессе будет зависеть от того, сколько записей возвращается при поиске. Если количество строк, соответствующих вашему первоначальному запросу, составляет лишь небольшую часть ваших 640 ГБ журналов, это не должно быть проблемой.
Поскольку основной вопрос также частично касается оптимизации этого поиска в целом, я отмечу, что есть два больших дополнительных улучшения, которые вы можете сделать:
-F
в zgrep. (Переключатель -w
для соответствия только целым словам также, вероятно, будет хорошей идеей. )Поиск литеральных строк выполняется намного быстрее, чем поиск регулярных выражений. LC_ALL=C
в среде команды. Поиск будет выполняться намного быстрее, работая в наборе символов ASCII из 128 -символов, чем в наборе символов UTF -из ~1000 -раз -большем -8 символов. Если у вас есть GNU Parallel, вы можете:
find /var/logs/syslog -name \* -print0 |
parallel --lb -0 'zgrep -f foo.txt {} | grep -v Duplicate' > /tmp/bar.txt
Наоборот xargs -P
при использовании вывода GNU Parallel гарантируется отсутствие смешивания строк (в соответствии с mywiki.wooledge.org/BashPitfalls #Non -atomic _пишет _с _xargs _-P ).