Regex awk для интерфейса Cisco

Regex awk для интерфейса Cisco

Я хотел бы узнать, есть ли какие-нибудь регулярные выражения Sed/Grep или Awk для анализа раздела интерфейса Cisco с определенным атрибутом, как показано ниже.

Содержимое файла .txt

!
interface FastEthernet0/1
 no ip unreachables
!
interface FastEthernet0/2
 no ip proxy-arp
!

Сценарий:

#!/bin/bash
VALUE="no ip proxy-arp"
awk -v RS='!\n' -v PATTERN=${VALUE} '/$PATTERN/' file.txt | awk '/^interface/';
exit 0

Проблема в том, что когда я запускаю строку непосредственно из оболочки, она работает, но когда я запускаю из скрипта, она не работает.

Запустив bash -x, я вижу, что awkне могу заменить значение переменной.

Какие-либо предложения ?

решение1

Трудно поверить, что это работает в вашей оболочке. Тем не менее, этот код содержит несколько ошибок, а также имеет неправильный подход IMHO.

awk ожидает строку между //не переменной. Это постоянные регулярные выражения. Поэтому вы либо заставляете оболочку поместить туда переменную, либо используете ~.

Ваш подход с исправлениями:

awk -v RS='!\n' -v PATTERN="${VALUE}" '$0 ~ PATTERN' file.txt | 
  awk '/^interface/'

Я удивлен, что это работает. Из документации я ожидал, что из-за настройки RS будет напечатан нежелательный "!". Однако я считаю, что это лучше:

awk -v PATTERN="${VALUE}" \
  '$0 ~ PATTERN { print previousline; }; { previousline=$0; }' file.txt

или с жестко запрограммированным шаблоном

awk '/no ip proxy-arp/ { print previousline; }; { previousline=$0; }' file.txt

или с помощью оболочки, пишущей узор

awk /"$VALUE"/' { print previousline; }; { previousline=$0; }' file.txt

решение2

эхо "!
интерфейс FastEthernet0/1
 нет ip недостижимых
!
интерфейс FastEthernet0/2
 нет ip proxy-arp
" | pcregrep -M "^интерфейс .*0/1\n (.*\n)!"

результат:

интерфейс FastEthernet0/1
 нет ip недостижимых

Связанный контент