Можете ли вы grep файл с помощью регулярного выражения и вывести только совпадающую часть строки? - PullRequest
12 голосов
/ 10 июня 2009

У меня есть файл журнала, который содержит несколько строк ошибок, таких как:

Failed to add email@test.com to database

Я могу отфильтровать эти строки одним вызовом grep:

grep -E 'Failed to add (.*) to database'

Это прекрасно работает, но я действительно хотел бы, чтобы grep (или другая команда Unix, в которую я передаю вывод), выводил только часть адреса электронной почты совпадающей строки.

Возможно ли это?

Ответы [ 8 ]

15 голосов
/ 10 июня 2009

sed нормально без grep:

sed -n 's/Failed to add \(.*\) to database/\1/p' filename
5 голосов
/ 04 сентября 2012

Вы также можете просто перенаправить grep к себе:)

grep -E 'Failed to add (.*) to database' | grep -Eo "[^ ]+@[^ ]+"

Или, если «интересующие строки» - это единственные строки с электронными письмами, просто используйте последнюю команду grep без первой.

5 голосов
/ 10 июня 2009

Вы можете использовать sed:

grep -E 'Failed to add (.*) to database'| sed 's/'Failed to add \(.*\) to database'/\1'
3 голосов
/ 17 июля 2009

Последние версии GNU grep имеют опцию -o, которая делает именно то, что вы хотите. (-o для --only-matching).

2 голосов
/ 10 июня 2009

Это должно сделать работу:

grep -x -e '(?<=Failed to add ).+?(?= to database)'

Используется положительное упреждающее утверждение, за которым следует сопоставление адреса электронной почты с последующим положительным проверочным утверждением. Это гарантирует, что оно соответствует всей строке, но только фактически использует (и, следовательно, возвращает) часть адреса электронной почты.

Параметр -x указывает, что grep должен соответствовать строкам, а не всему тексту.

1 голос
/ 10 июня 2009

или питон:

cat file | python -c "import re, sys; print '\r\n'.join(re.findall('add (.*?) to', sys.stdin.read()))"
0 голосов
/ 28 апреля 2015

-r опция для sed позволяет регулярные выражения без обратной косой черты

sed -n -r 's/Failed to add (.*) to database/\1/p' filename
0 голосов
/ 14 июля 2009

Если вы хотите использовать grep, было бы более целесообразно использовать egrep;

About egrep

Search a file for a pattern using full regular expressions.

grep не всегда будет настолько полнофункциональным для регулярных выражений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...