У меня есть отчет, содержащий информацию о списке серверов. Я хочу найти в этом списке время безотказной работы в течение определенного количества, а также 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
На самом деле вы можете использовать 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
) удаляется из статического текста и печатаются первое и последнее поля.
@officialpsoul $NF
— последнее поле, так что сработает.
@WiktorStribiżew У меня пока это не работает, ничего не возвращает. Когда я запускаю команду, в новом файле ничего нет или ничего не выводится на экран,
@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
Я все еще тестирую, но ввод любого оператора, предоставленного вами в awk.js.org, ничего не возвращает, и он не работает, когда я запускаю его из реальной командной строки. Я вижу, что онлайн-демонстрация работает на вас.
Я думаю, что в 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}'
.
@ChrisSchneider Я думаю, у вас есть старый awk, например nawk
или mawk
, который не поддерживает квантификаторы диапазона.
Это, безусловно, более старая версия awk, во власти нашей текущей версии здесь, RHEL6, gawk 3.1.7. Я посмотрю, смогу ли я попробовать что-то более современное — дома у меня есть текущая версия Arch.
@WiktorStribiżew Спасибо за вашу помощь, это действительно сработало в более новой версии, трудно объяснить, какие изменения происходят между разными версиями! Единственное изменение, которое мне пришлось сделать, это изменить его на $2, поэтому" awk -F"\n" -v RS = "" '$0 ~ /up (9[0-9]|[0-9]{3,} ) days/{gsub(/Соединение с | закрыто\./, "", $NF); print $2 "\n" $NF}' файл > маркировка нового файла решена!
@ChrisSchneider Очень рад, что это сработало для вас. Возможно, у вас есть символы без пробелов в начале строк, за которыми следуют пробелы. Поскольку вы не предоставили точный файл, я мог протестировать только небольшой образец, которым вы поделились, и SO обычно нормализует некоторые редкие символы, такие как диакритические знаки или непечатаемые символы. Итак, если у вас есть какие-то странные файлы от неизвестных поставщиков, вам следует рассмотреть возможность предоставления части из них нам, чтобы помочь вам быстрее и надежнее.
then Field 5 (the fifth line in the record)
не обязательно может быть 5-й строкой. =>several lines of disk space information, between 14 and 16 lines