2012-03-22 1 views
0

я сжат .gz файлов, которые я хочу открыть с помощью:Как использовать zcat с регулярным выражением в perl?

./open.pl file.gz 

В основном моя цель, чтобы печатать только определенные строки в почтовом файле, который соответствует моему регулярному выражению ... Файлы большие, поэтому я просто хочу вывести на stdout сейчас ... Как мне это сделать? Я думал somethig как:

while(<>){ 
    zcat $_ | <my regex> ???? 
} 

Кроме того, я не уверен, что синтаксис для полиграфических линий из этого матча регулярного выражения ..

+0

Вы можете использовать 'zgrep'? – toolic

ответ

1

Сомневаюсь zcat будет корректно работать на новой строку разделенных кусков со сжатым потоком , Вместо этого вы захотите разжать поток по мере его чтения. Есть по крайней мере, несколько способов сделать это:

foreach my $argv (@ARGV) { 
    open my $gz, "zcat $argv |"; 
    while (<$gz>) { 
     # now $_ is an uncompressed line from the file $argv 
     print if /my pattern/; 
    } 
} 

Там, наверное, решение с использованием слоя :gz IO, тоже, но я совсем не могу получить, что правильно сейчас.

3

Вот как я сделал аналогичный

open($handle, "zcat $ARGV[0]|") or die("Can't open $ARGV[0]: $!"); 
while(<$handle>) { 
if(/regex_pattern/) { 
    print $_; 
    } 
} 
+0

Предложение инструментария намного лучше, если у вас нет необходимости в дополнительной обработке в вашем скрипте perl ... zgrep string_to_match file.gz –