Печатать только совпадающие строки в perl из командной строки - PullRequest
14 голосов
/ 24 февраля 2011

Я пытаюсь извлечь все IP-адреса из файла.Пока я просто использую

cat foo.txt | perl -pe 's/.*?((\d{1,3}\.){3}\d{1,3}).*/\1/'

, но это также печатает строки, которые не содержат совпадения.Я могу исправить это, отправив через grep, но, похоже, это не нужно и может привести к ошибкам, если регулярные выражения не совпадают идеально.

Есть ли более простой способ сделать это?

Ответы [ 4 ]

22 голосов
/ 24 февраля 2011

Попробуйте это:

cat foo.txt | perl -ne 'print if s/.*?((\d{1,3}\.){3}\d{1,3}).*/\1/'

или:

<foo.txt perl -ne 'print if s/.*?((\d{1,3}\.){3}\d{1,3}).*/\1/'

Это самая короткая альтернатива, которую я могу придумать, все еще используя Perl.

Однако этот способ может бытьправильнее:

<foo.txt perl -ne 'if (/((\d{1,3}\.){3}\d{1,3})/) { print $1 . "\n" }'
16 голосов
/ 24 февраля 2011

Если у вас есть grep, просто вызовите grep:

grep -Po "(\d{1,3}\.){3}\d{1,3}" foo.txt
12 голосов
/ 24 февраля 2011

У вас уже есть подходящий ответ об использовании grep для извлечения IP-адресов, но только для объяснения того, почему вы видите, что несоответствия печатаются:

perldoc perlrun расскажет вам обо всех параметрах, которые вы можете передать Perl в командной строке.

Цитата из него:

-p   causes Perl to assume the following loop around your program, which makes it 
     iterate over filename arguments somewhat like sed:

     LINE:
     while (<>) {
         ...             # your program goes here
     } continue {
         print or die "-p destination: $!\n";
     }

Вместо этого вы могли бы использовать переключатель -n, который работает аналогично, но не печатает автоматически, например:

cat foo.txt | perl -ne '/((?:\d{1,3}\.){3}\d{1,3})/ and print $1'

Кроме того, нет необходимости использовать cat; Perl откроет и прочитает имена файлов, которые вы ему дадите, так что вы можете сказать, например ::

perl -ne '/((?:\d{1,3}\.){3}\d{1,3})/ and print $1' foo.txt
1 голос
/ 24 февраля 2011
ruby -0777 -ne 'puts $_.scan(/((?:\d{1,3}\.){3}\d{1,3})/)' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...