Не включайте последнюю строку в соответствие между шаблонами в awk и sed, но включайте первую
Извинения - Iv'e теперь отредактировал заголовок - заголовок изначально был противоположен тому, что я хотел.
Я хочу включить первую строку шаблона и каждую строку до появления конечного шаблона. Конечный шаблон является подмножеством стартового шаблона, поэтому sed ведет себя иначе, чем AWK.
Цель этого состоит в том, чтобы создать функцию bash, которая перечисляет группы объектов Cisco ASA типа сети.
В дополнение к этому, если какая-либо из строк в строках вывода содержит "групповой объект" - тогда этот групповой объект также необходимо перечислить. Я уверен, с некоторыми циклами, если это и awk и / или sed, это может быть сделано.
например
object-group network OBJECT-GROUP-DADDY
network-object 10.1.1.0 255.255.255.0
network-object 10.2.1.0 255.255.255.0
group-object NESTED-OBJECT-GROUP
network-object 10.3.1.0 255.255.255.0
object-group network ANY-OTHER-OBJECT-GROUP
network-object 10.1.1.0 255.255.255.0
object-group network NESTED-OBJECT-GROUP
network-object 10.11.1.0 255.255.255.0
network-object 10.22.1.0 255.255.255.0
Вернул бы:
object-group network OBJECT-GROUP-DADDY
network-object 10.1.1.0 255.255.255.0
network-object 10.2.1.0 255.255.255.0
group-object NESTED-OBJECT-GROUP --+ EXPANDED BELOW
----network-object 10.11.1.0 255.255.255.0
----network-object 10.22.1.0 255.255.255.0
На данный момент - я не могу даже заставить работать первую часть (не перечисляя вложенные группы) Также - вложенные группы, могли бы иметь вложенные группы! Argh
sed -n '/object-group network OBJECT-GROUP-DADDY/,/object-group network/p' ASA_CONFIG.cfg
дает мне то, что мне нужно, но включает в себя первую строку шаблона END, которая является началом группы объектов, которые меня не волнуют.
Версия awk, похоже, ничего не возвращает, я предполагаю, потому что конечный шаблон является подстрокой стартового шаблона:
awk '/object-group network OBJECT-GROUP-DADDY/,/object-group network/p' ASA_CONFIG.cfg
было руководство по этому вопросу с использованием next и flags, но я не мог сделать это из множества разных сайтов.
ОК, здесь добавлена информация:
Отвечая на ваши вопросы, я не знаю ни языка awk, ни sed. Я сетевой инженер - и я думаю, для тех из вас, кто не балуется этой дисциплиной, почему я хочу достичь этого, для вас загадка. Я ужасен в программировании, и мой Linux очень слабый.
Списки контроля доступа в конфигурации cisco ASA обычно создаются с помощью списков доступа, таких как:
access-list ACCESS-LIST расширенное разрешение ip объектная группа SOURCE-OBJECT-GROUP объектная группа DESTINATION-OBJECT-GROUP
Все, что написано прописными буквами, было введено человеком, какой-то момент времени, слова в нижнем регистре зарезервированы cisco для анализа и т. Д. "Группы объектов" подобны массивам в языке программирования. Эти списки доступа могут также содержать более одной строки или иметь явно определенные сети, а не использовать группы объектов.
Я хотел бы перечислить все записи групп объектов, как для исходной, так и для целевой группы объектов, которая находится в указанном Access-list. Формат этих групп объектов приведен ниже
object-group network DESTINATION-OBJECT-GROUP
network-object 10.33.1.0 255.255.255.0
network-object 10.44.1.0 255.255.255.0
object-group network ANY-OTHER-OBJECT-GROUP
network-object 10.1.1.0 255.255.255.0
object-group network SOURCE-OBJECT-GROUP
network-object 10.1.1.0 255.255.255.0
network-object 10.2.1.0 255.255.255.0
group-object NESTED-OBJECT-GROUP
network-object 10.3.1.0 255.255.255.0
object-group network NESTED-OBJECT-GROUP
network-object 10.11.1.0 255.255.255.0
network-object 10.22.1.0 255.255.255.0
В приведенном выше примере, используя список контроля доступа, представленный ранее, я хотел бы вывод исходной группы объектов:
object-group network SOURCE-OBJECT-GROUP
network-object 10.1.1.0 255.255.255.0
network-object 10.2.1.0 255.255.255.0
group-object NESTED-OBJECT-GROUP
network-object 10.3.1.0 255.255.255.0
однако обратите внимание, что эта группа объектов с именем SOURCE-OBJECT-GROUP также содержит объект-группу, который является зарезервированным словом, которое означает - это группа вложенных объектов, и ее необходимо прочитать откуда-то еще в конфигурации.
Таким образом, результат должен быть:
object-group network SOURCE-OBJECT-GROUP
network-object 10.1.1.0 255.255.255.0
network-object 10.2.1.0 255.255.255.0
group-object NESTED-OBJECT-GROUP
---enumerated----network-object 10.3.1.0 255.255.255.0
network-object 10.3.1.0 255.255.255.0
Мы бы не хотели выводить данные из других групп объектов, которые не являются частью списка доступа или не вложены в список доступа верхнего уровня. Эта концепция похожа на вложенные группы в Active Directory.
Я сейчас попытаюсь дать вам некоторый псевдокод:
AWK выводит имена / переменные группы объектов из списка доступа, используя awk print $6 и awk print $ 9
access-list ACCESS-LIST расширенное разрешение ip объектная группа SOURCE-OBJECT-GROUP объектная группа DESTINATION-OBJECT-GROUP
сохранить каждый из них как некоторую переменную, а затем перечислить. как $source-object-group-name, $destination-object-group-name
функция enumerate-object-group input $source-object-group-name
Поэтому, если $source-object-group-name = "SOURCE-OBJECT-GROUP" выполнить какое-то явное сопоставление с образцом, которое не будет совпадать с "SOURCE-OBJECT-GROUP1", (что-то вроде стиля grep -w) выведите каждую строку ниже, это потому, что многие группы объектов имеют более длинные имена, чем другие. Например, бег - это подстрока бега
(1) вывести "строку заголовка" сети объектов-групп SOURCE-OBJECT-GROUP
(2) Проверьте, начинается ли строка с "group-object"(обратите внимание, что это обратное зарезервированное имя, поэтому cisco может различать) ---> YES? отправить значение этой "объектной группы" другой функции, как эта. Это значение можно получить с помощью awk print $2.
---> НЕТ? выведите строку, потому что она "нормальная", так как не начинается с "group-object"
network-object 10.1.1.0 255.255.255.0
network-object 10.2.1.0 255.255.255.0
---> ДА? отправить значение этой "объектной группы" другой функции, как эта. Это значение можно получить с помощью awk print $2 (перейти к 1?)
(3) продолжайте настройку до тех пор, пока мы не нажмем какой-нибудь текст, который начинается с "сети группы объектов", НО тогда не будет содержать явного имени исходного объекта группы, то есть - это новая группа объектов, которую мы не делаем заботьтесь о том, что мы расширяем не тот, кого мы извлекаем из списка доступа, и не тот, который был вложенным.
закачать $ destination-object-group-name в функцию repeat для всех строк в access-list
Я понимаю, что это сложно, и что здесь существует два (или более) уровня вложенных групп. дайте мне знать, если вам нужно больше информации.
Я не мог заставить комментарии отображаться правильно, пробовал двойной пробел для разрывов строк.
Я попробовал ваше предложение, заменив end sed p на {$d;p}, но я выхожу так же:
[nickc@localhost ~]$ sed -n '/object-group network SOURCE-OBJECT-GROUP/,/object-group network/{$d;p}' ASA_CONFIG.cfg
object-group network SOURCE-OBJECT-GROUP
network-object 10.1.1.0 255.255.255.0
network-object 10.2.1.0 255.255.255.0
group-object NESTED-OBJECT-GROUP
network-object 10.3.1.0 255.255.255.0
object-group network NESTED-OBJECT-GROUP
[nickc@localhost ~]$ sed -n '/object-group network SOURCE-OBJECT-GROUP/,/object-group network/p' ASA_CONFIG.cfg
object-group network SOURCE-OBJECT-GROUP
network-object 10.1.1.0 255.255.255.0
network-object 10.2.1.0 255.255.255.0
group-object NESTED-OBJECT-GROUP
network-object 10.3.1.0 255.255.255.0
object-group network NESTED-OBJECT-GROUP
Нам нужно убедиться, что последняя строка опущена. Я тестирую с текстом ниже:
nickc@localhost ~]$ cat ASA_CONFIG.cfg
object-group network DESTINATION-OBJECT-GROUP
network-object 10.33.1.0 255.255.255.0
network-object 10.44.1.0 255.255.255.0
object-group network ANY-OTHER-OBJECT-GROUP
network-object 10.1.1.0 255.255.255.0
object-group network SOURCE-OBJECT-GROUP
network-object 10.1.1.0 255.255.255.0
network-object 10.2.1.0 255.255.255.0
group-object NESTED-OBJECT-GROUP
network-object 10.3.1.0 255.255.255.0
object-group network NESTED-OBJECT-GROUP
network-object 10.11.1.0 255.255.255.0
network-object 10.22.1.0 255.255.255.0
1 ответ
sed -n '/object-group network OBJECT-GROUP-DADDY/,/object-group network/{$d;p}' ASA_CONFIG.cfg
$ D удалит последнюю строку шаблона.
Обновление: решение, описанное выше, должно работать, насколько я знаю, но по какой-то причине не работает (возможно, ошибка sed) - это обходной путь:
sed -n '/object-group network OBJECT-GROUP-DADDY/,/object-group network/p' ASA_CONFIG.cfg | sed '$d'