Как удалить символы до и после текста в цепочке символов с помощью Grep, зная, что текст создается с помощью переменной?

^и $совпадают соответственно в начале и конце строки, поэтому строки с этими 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реализации, такие как -oGNU 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'
0
13.11.2021, 17:35
2 ответа

Вы можете попробовать это:

$ grep 'name=>' log.txt | cut -d'"' -f2

|направляет вывод grepна вход cut.

cut -d'"' -f2разрезает каждую строку ввода на поля, разделенные символом ", и извлекает второе поле.

Если вы хотите сохранить символ "вокруг названий городов, это может не сработать.

0
13.11.2021, 22:47

Основное применение утилиты grep— извлечение строк, соответствующих определенному регулярному выражению. Некоторые нестандартные -реализации grepтакже могут извлекать подстроки из строк, но это посягает на область применения редактора sed, обычно используемого для редактирования строк в файлах или текстовых потоках по сценарию.

Использование стандарта sed: сначала удалить все строки, не содержащие подстроку name=>, а затем обрезать оставшиеся строки, удалив все, кроме строки в кавычках послеname=>:

sed -e '/.*name=>/!d' -e 's///' -e 's/",.*/"/' log.txt

(Предполагается, что это должно выполняться непосредственно в исходном файле.)

Первое выражение, /.*name=>/!d, удаляет все строки, не соответствующие заданному регулярному выражению.

Второе выражение, s///, удаляет из оставшихся строк тот бит строки, который соответствует предыдущему регулярному выражению.

Третье выражение, s/",.*/"/, удаляет все после строки в кавычках, заменяя все, начиная с ",, только на ".

0
14.11.2021, 11:27

Теги

Похожие вопросы