2017-02-05 6 views
0

i около 50 .gz файлов в определенном каталоге в linux. Мне нужно найти определенную строку в каждом файле. в настоящее время я делаю zcat каждый файл.Найдите строку в списке .gz-файлов

Например:

zcat 20160909-custfw.log.7.gz | zgrep BGP | zgrep 145.247.1.62 

Выход:

9 сентября 17:12:47 145.247.1.62 капсюль-s12-custfw-1: NetScreen device_id = капсюль-s12-custfw-1 [Root] система информационно-00542: BGP сверстники 10.24.224.187 изменились в состоянии ожидания (2016-09-09 17:13:15)

пожалуйста, дайте мне, если есть какой-нибудь простой способ сделай это.

+0

Я удивлен тем, что выше на самом деле работает. zcat распаковывает все это и печатает все в stdout. Вы тратите много циклов процессора абсолютно без причины. – GhostCat

+0

Кроме того. этот сайт посвящен проблемам программирования. Например, ваш вопрос скорее перейдет на страницу unix.stackexchange.com. – GhostCat

ответ

0

Поиск их параллельно с GNU Parallel :

parallel zgrep BGP {} ::: *.gz | grep 145.247.1.62 

Если вы знаете, что это происходит только один раз в каждом файле, или заинтересованы только в первом упоминании, используйте zgrep -m1, чтобы не беспокоить, чтобы прочитать оставшуюся часть файла и останавливается на первом матче.

+0

спасибо, это было именно то, что я искал, я хочу проверить первое появление. – user7315541

2

Если у вас уже установлено zgrep, вам не нужно указывать zcat. Весь смысл zgrep - предоставить вам grep gzipped файлы напрямую. Таким образом, вы должны просто сделать это:

zgrep BGP *.gz | grep 145.247.1.62 

Это должно быть немного более эффективным.

1

Как насчет zgrep 'BGP.*145.247.1.62' $dir/*.gz?

(или для достижения эквивалентных результатов в вашей последовательности двух zgrep вызовов, вы должны zgrep также обратный порядок двух регулярных выражений, СТГ как zgrep 'BGP.*145.247.1.62\|145.247.1.62.*BGP' $dir/*.gz.)