Я получил несколько полезных ответов в прошлом и надеюсь, что вы все поможете мне. Я столкнулся с каким-то странным поведением, которое мне не совсем по силам. Я обрабатываю файлы конфигурации для коммутаторов Cisco и хочу сгенерировать вывод со списком IP-адресов VLAN в формате, который будет показывать:
Vlan1: 172.31.200.1 255.255.255.0
Vlan10: 172.40.220.1 255.255.255.0
«Vlan» будет записан в переменную, а IP / маска извлекается с использованием «sed», и это работает по большей части. Иногда он отказывается заполнять переменную «vlan», хотя он отлично работает для других конфигов.
Если есть только одна VLAN, она обрабатывает эту, а если есть более одной, она обрабатывает дополнительные. Если пользователь выбирает (-v), он включает в список VLAN1, в нем настроено несколько VLAN (в противном случае он игнорирует VLAN1).
Этот входной файл выглядит неработающим (Имя файла 1.cfg):
!
interface Vlan1
ip address 172.29.96.100 255.255.255.0
!
ip default-gateway 172.29.96.1
ip http server
no ip http secure-server
!
Этот входной файл работает нормально (имя файла 2.cfg):
!
interface Vlan1
ip address 172.31.200.111 255.255.255.0
no ip route-cache
!
ip default-gateway 172.31.200.1
ip http server
ip http secure-server
Вывод, который я получаю, таков:
Обратите внимание, как в первом не указана ссылка "Vlan1"?
Вот мой сценарий:
#!/bin/bash
if [ -f getlan.log ];
then
rm getlan.log
fi
TempFile=getlan.log
verbose=0
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
-v)
verbose=1
shift
;;
#*)
#exit
#shift
#;;
esac
done
#Start Processing all files
files=$( ls net )
for i in $files; do
#########################################################
# Collect Configured VLAN Interfaces and IP Information #
#########################################################
echo "-------- Configured VLAN Interfaces --------" >> ~/$TempFile
echo "" >> ~/$TempFile
if [ `grep "^interface Vlan" ~/net/$i | awk '{ print $2 }' | wc -l` -gt 1 ];
then
for g in `grep "^interface Vlan" ~/net/$i | awk '{ print $2 }'`;
do
if [ $g == "Vlan1" ];
then
if [ $verbose -gt 0 ];
then
echo "$g": `sed -n '/^interface '$g'/,/!/p' ~/net/$i | head -n 5 | grep -i "ip address" | awk '{ print $3, $4 }'` >> ~/$TempFile
fi
else
echo "$g": `sed -n '/^interface '$g'/,/^!/p' ~/net/$i | grep -i "ip address" | awk '{ print $3, $4 }'` >> ~/$TempFile
fi
done
echo "" >> ~/$TempFile
else
vlanid=`grep "^interface Vlan" ~/net/$i | awk '{ print $2 }'`
echo $vlanid: `sed -n '/^interface 'Vlan'/,/^!/p' ~/net/$i | grep -i "address" | awk '{ print $3, $4 }'` >> ~/$TempFile
echo "" >> ~/$TempFile
fi
done
Было бы действительно здорово, если бы это было более последовательным. Спасибо!