1

Я хочу grep IP-адреса в файле до строки с "УДАЛИТЬ" содержимое. Я попробовал следующее, но скрипт выдает все IP, в том числе и после "УДАЛИТЬ".

a="[A-Z]"

cat *.txt| until [[ "$a" =  "REMOVE" ]]; do grep -oE "([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}"; done

1 ответ1

1

сделайте это с помощью sed oneliner:

sed -n -s -r '1,/REMOVE/ { s/.*(([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}).*/\1/p }' *.txt

объяснение:

  • -n заставляет sed не печатать строки, если это не указано явно с помощью команды p .
  • -s заставляет sed обрабатывать каждый файл отдельно, а не объединять все файлы в один поток.
  • -r заставляет sed использовать расширенный синтаксис регулярных выражений, который требует меньше экранирования.

обратите внимание, что -s и -r являются расширением gnu для sed. если вы не знаете, что означает расширение gnu, скорее всего, вы используете gnu sed. если вы не используете GNU sed, вам придется обойти отсутствующие функции.

больше объяснений:

  • Сценарий sed 1,/REMOVE/ { commands } означает выполнение команд внутри фигурных скобок от первой строки ввода до строки, содержащей REMOVE .
  • Сценарий sed s/pattern/replacement/p replace / p означает поиск шаблона, замену на замену и затем распечатку этой замены.
  • шаблон .*(([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}).* - шаблон, распознающий все строки, содержащие цепочку четыре трехзначных числа, разделенных точками. это также захватывает цепь в так называемой группе.
  • обратная ссылка \1 ссылается на первую из захваченных групп. это означает, что нужно отбросить оставшуюся часть строки и напечатать только IP-адрес.

Прочитайте руководство по sed для более подробного объяснения. см. также учебник по sed.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .