Сортировка информации и обработка вывода с переменными в Bash - PullRequest
0 голосов
/ 29 августа 2018

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

Было бы действительно здорово, если бы это было более последовательным. Спасибо!

1 Ответ

0 голосов
/ 29 августа 2018

Подход, основанный на передовом опыте, может выглядеть так:

#!/usr/bin/env bash
interface_re='^[[:space:]]*interface[[:space:]]+(.*)'
ip_re='^[[:space:]]*ip address (.*)'

process_file() {
  local line interface

  interface=
  while IFS= read -r line; do
    if [[ $line =~ $interface_re ]]; then
      interface=${BASH_REMATCH[1]}
      continue
    fi
    if [[ $interface ]] && [[ $line =~ $ip_re ]]; then
      echo "${interface}: ${BASH_REMATCH[1]}"
    fi
  done
}

for file in net/*; do
  process_file <"$file"
done

Это можно проверить следующим образом:

process_file <<'EOF'
!
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
!
!
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
EOF

... который правильно идентифицирует ip address строки из обоих interface блоков, испуская:

Vlan1: 172.29.96.100 255.255.255.0
Vlan1: 172.31.200.111 255.255.255.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...