-1

Журнал OpenVPN выглядит так:

OpenVPN

CLIENT LIST
Updated,Sat Jun 20 04:20:07 2015
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
[ A .... ]
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
[ B.... ]
GLOBAL STATS
Max bcast/mcast queue length,33
END

Где A и B выше - это списки хостов, отформатированные определенным образом.

У меня есть сценарий bash, который я буду использовать для действий над элементами в части, называемой "ROUTING TABLE" (B). Как мне эффективно отделить этот список хостов от остальной части документа в моем сценарии?

2 ответа2

1

Вы можете использовать sed для удаления (d) строк из строки 1 в соответствующую стартовую строку. Затем удалите строки из соответствующей конечной строки до последней строки ($). Вы, вероятно, также хотите удалить строку заголовка "Виртуальный адрес". Все, что осталось, это то, что вы хотите!

sed '1,/^ROUTING TABLE/d
     /^Virtual Address,/d
     /^GLOBAL STATS/,$d'
1

Следующая команда sed

      sed -n '/ROUTING/,/\[ B/{p}' filename

делает то, что вы хотите: -n подавляет поведение по умолчанию, которое состоит в печати каждой строки, выражение между одинарными кавычками выбирает диапазон строк, а затем печатает их (это значение {p}). Выбираемые диапазоны определяются с помощью совпадений (начального и конечного), разделенных сепаратрисами, в моем случае я использую косую черту / в качестве сепаратрисы; начальное и конечное совпадения с образцом должны быть разделены запятой, и \[ используется для подчеркивания буквального значения квадратных скобок, то есть это не грамматическая структура, а вместо этого настоящая открывающая квадратная скобка, которую необходимо найти.

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