^
и $
совпадают соответственно в начале и конце строки, поэтому строки с этими IP-адресами совпадают только в том случае, если IP-адрес находится как в начале, так и в конце строки, то есть если IP-адрес — это вся строка.
Теперь, если вы хотите сопоставить строки, содержащие IP-адрес целиком слово , где слова пусты -с разделителями, вы можете использовать:
d='[01234567890]'
n="($d|[123456789]$d|1$d$d|2[01234]$d|25[012345])"
grep -E "(^|[[:blank:]])$n\.$n\.$n\.$n([[:blank:]]|\$)" ip.txt
(здесь также замена [0-9]
на [0123456789]
, поскольку [0-9]
часто соответствует гораздо большему, чем просто 0123456789 ).
Обратите внимание, что grep
выводит совпадающие строки . Если вы хотите выводить только части строк, вам нужно использовать такие вещи, как sed
или perl
вместо (потоковых редакторов ), или использовать некоторые не -стандартные расширения некоторых grep
реализации, такие как -o
GNU grep
.
Здесь используется отрицательный взгляд -вокруг операторов ((?<!\H)
, что означает «при условии, что ему не предшествует не -пробел» , (?!\H)
то же самое, но взгляд вперед, а не назад, (?1)
вызывает RE в первой группе (...)
, все perl -подобные операторы включены с-P
:
grep -Po '(?<!\H)(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.(?1)\.(?1)\.(?1)(?!\H)' ip.txt
Что было бы эквивалентно:
perl -lne 'print for
/(?<!\H)(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.(?1)\.(?1)\.(?1)(?!\H)/g'
Вы можете попробовать это:
$ grep 'name=>' log.txt | cut -d'"' -f2
|
направляет вывод grep
на вход cut
.
cut -d'"' -f2
разрезает каждую строку ввода на поля, разделенные символом "
, и извлекает второе поле.
Если вы хотите сохранить символ "
вокруг названий городов, это может не сработать.
Основное применение утилиты grep
— извлечение строк, соответствующих определенному регулярному выражению. Некоторые нестандартные -реализации grep
также могут извлекать подстроки из строк, но это посягает на область применения редактора sed
, обычно используемого для редактирования строк в файлах или текстовых потоках по сценарию.
Использование стандарта sed
: сначала удалить все строки, не содержащие подстроку name=>
, а затем обрезать оставшиеся строки, удалив все, кроме строки в кавычках послеname=>
:
sed -e '/.*name=>/!d' -e 's///' -e 's/",.*/"/' log.txt
(Предполагается, что это должно выполняться непосредственно в исходном файле.)
Первое выражение, /.*name=>/!d
, удаляет все строки, не соответствующие заданному регулярному выражению.
Второе выражение, s///
, удаляет из оставшихся строк тот бит строки, который соответствует предыдущему регулярному выражению.
Третье выражение, s/",.*/"/
, удаляет все после строки в кавычках, заменяя все, начиная с ",
, только на "
.