
Я хотел бы узнать, есть ли какие-нибудь регулярные выражения 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 недостижимых