Регулярное выражение в notepad++ или sed для возврата двух разных строк

У меня есть отчет, содержащий информацию о списке серверов. Я хочу найти в этом списке время безотказной работы в течение определенного количества, а также IP-адрес сервера. Я использовал notepad ++ для поиска, но синтаксис sed тоже подойдет. В отчете есть такие данные:

some.dns.com
up 720 days,
some version
several lines of disk space information, between 14 and 16 lines
Connection to 10.1.1.1 closed.

some.other.dns
up 132 days,
some version
several lines of disk space information, between 14 and 16 lines
Connection to 10.1.1.2 closed.

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

up ([9-9]\d|\d{3,} days,)

Но мне также нужны IP-адреса, чтобы понять это, и я не смог найти способ получить ТОЛЬКО IP-адреса, связанные с серверами с высоким временем безотказной работы.

Я нашел что-то вроде этого, чтобы найти IP-адреса:

((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.){3}(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)))

Итак, я надеялся вернуть что-то вроде следующего:

up 720 days,
10.1.1.1
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На самом деле вы можете использовать awk:

awk -F"\n" -v RS = "" '$0 ~ /up (9[0-9]|[0-9]{3,}) days/{gsub(/Connection to | closed\./, "", $NF); print $1 "\n" $NF}' file > newfile

См. онлайн демо

Файл читается абзац за абзацем, а поля разделяются новой строкой. Если запись соответствует шаблону up (9[0-9]|[0-9]{3,}) days (up с пробелом, затем 9 с любой цифрой или любыми 3 цифрами с пробелом и days, то последнее поле ($NF) удаляется из статического текста и печатаются первое и последнее поля.

then Field 5 (the fifth line in the record) не обязательно может быть 5-й строкой. => several lines of disk space information, between 14 and 16 lines
maswerdna 11.06.2019 00:21

@officialpsoul $NF — последнее поле, так что сработает.

Wiktor Stribiżew 11.06.2019 00:59

@WiktorStribiżew У меня пока это не работает, ничего не возвращает. Когда я запускаю команду, в новом файле ничего нет или ничего не выводится на экран,

Chris Schneider 11.06.2019 15:21

@ChrisSchneider Предположим, что ваш файл file.txt. Вы должны использовать awk -F"\n" -v RS = "" '$0 ~ /up (9[0-9]|[0-9]{3,}) days/{gsub(/Connection to | closed\./, "", $NF); print $1 "\n" $NF}' file.txt > result.txt. Другой вариант того же самого: awk 'BEGIN {OFS=FS = "\n";RS = ""}; $0 ~ /up (9[0-9]|[0-9]{3,}) days/{gsub(/Connection to | closed\./, "", $NF); print $1 OFS $NF}' file.txt > result.txt

Wiktor Stribiżew 11.06.2019 15:22

Я все еще тестирую, но ввод любого оператора, предоставленного вами в awk.js.org, ничего не возвращает, и он не работает, когда я запускаю его из реальной командной строки. Я вижу, что онлайн-демонстрация работает на вас.

Chris Schneider 11.06.2019 15:59

Я думаю, что в awk.js.org есть ошибка: он не позволяет квантификаторы диапазона. AWK по умолчанию поддерживает синтаксис регулярных выражений POSIX ERE и должен разрешать [0-9]{3,}. Если в вашей среде это не так, замените его на [0-9][0-9][0-9][0-9]*. На этом сайте работает команда -F"\n" -v RS = "" '$0 ~ /up (9[0-9]|[0-9][0-9][0-9][0-9]*) days/{gsub(/Connection to | closed\./, "", $NF); print $1 "\n" $NF}'.

Wiktor Stribiżew 11.06.2019 16:13

@ChrisSchneider Я думаю, у вас есть старый awk, например nawk или mawk, который не поддерживает квантификаторы диапазона.

Wiktor Stribiżew 11.06.2019 16:21

Это, безусловно, более старая версия awk, во власти нашей текущей версии здесь, RHEL6, gawk 3.1.7. Я посмотрю, смогу ли я попробовать что-то более современное — дома у меня есть текущая версия Arch.

Chris Schneider 11.06.2019 16:53

@WiktorStribiżew Спасибо за вашу помощь, это действительно сработало в более новой версии, трудно объяснить, какие изменения происходят между разными версиями! Единственное изменение, которое мне пришлось сделать, это изменить его на $2, поэтому" awk -F"\n" -v RS = "" '$0 ~ /up (9[0-9]|[0-9]{3,} ) days/{gsub(/Соединение с | закрыто\./, "", $NF); print $2 "\n" $NF}' файл > маркировка нового файла решена!

Chris Schneider 11.06.2019 17:28

@ChrisSchneider Очень рад, что это сработало для вас. Возможно, у вас есть символы без пробелов в начале строк, за которыми следуют пробелы. Поскольку вы не предоставили точный файл, я мог протестировать только небольшой образец, которым вы поделились, и SO обычно нормализует некоторые редкие символы, такие как диакритические знаки или непечатаемые символы. Итак, если у вас есть какие-то странные файлы от неизвестных поставщиков, вам следует рассмотреть возможность предоставления части из них нам, чтобы помочь вам быстрее и надежнее.

Wiktor Stribiżew 11.06.2019 21:59

Другие вопросы по теме