Не включайте последнюю строку в соответствие между шаблонами в 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'

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