Bash, если определенная строка найдена в grep группы файлов, затем выполните - PullRequest
1 голос
/ 29 мая 2019

У меня есть файл конфигурации устройства, и я хотел бы проверить, соответствует ли его версия моему списку или нет.

Во-первых, мне нужно проверить их модель.

Второй шаг: для каждой модели одобрена только конкретная версия. Пример:

Model 1841, Version 15.1(4)M7, 15.1(4)M10, or 15.2(1)T4 are approved.
Model 2800, Version 15.1(2)GC2, 15.1(4)M10, 15.1(4)M12a are approved.
Model C2960, Version 15.0(2)SE9 and 15.0(2)SE11 are approved.

Это образец файлов конфигурации.

[user@linux]$ more Device*
::::::::::::::
DeviceA
::::::::::::::
DeviceA#sh ver
Cisco IOS Software, 1841 Software (C1841-ADVSECURITYK9-M), Version 15.1(4)M10, RELEASE SOFTWARE (fc2)
::::::::::::::
DeviceB
::::::::::::::
DeviceB#sh ver
Cisco IOS Software, 2800 Software (C2800NM-ADVSECURITYK9-M), Version 15.1(4)M10, RELEASE SOFTWARE (fc2)
::::::::::::::
DeviceC
::::::::::::::
DeviceC#sh ver
Cisco IOS Software, C2960 Software (C2960-LANBASEK9-M), Version 12.2(55)SE8, RELEASE SOFTWARE (fc2)
[user@linux]$

Это мой скрипт для проверки модели из каждого файла конфигурации

#!/bin/bash
if grep --color=auto 'Cisco IOS Software' * > /dev/null
then
    echo found
else
    echo not found
fi

Пример вывода

[user@linux]$ ./script.sh
found
[user@linux]$

Мне удалось найти модель, которая является первым шагом. Но все еще не могу понять, как проверить, имеет ли данная модель утвержденную версию или нет.

Желаемый выход

Если он имеет утвержденную версию, то результат должен быть в порядке. Если нет, устройство использует неутвержденную версию.

Пример

DeviceA - Model 1841 - Version 15.1(4)M10 = OK
DeviceB - Model 2800 - Version 15.1(4)M10 = OK
DeviceC - Model C2960, Version 12.2(55)SE8 = NOT OK

Надеюсь, этот вопрос достаточно ясен, если нет, пожалуйста, дайте мне знать.

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Следующий скрипт с комментариями в нем:

# our devices input file
cat <<EOF >devices
::::::::::::::
DeviceA
::::::::::::::
DeviceA#sh ver
Cisco IOS Software, 1841 Software (C1841-ADVSECURITYK9-M), Version 15.1(4)M10, RELEASE SOFTWARE (fc2)
::::::::::::::
DeviceB
::::::::::::::
DeviceB#sh ver
Cisco IOS Software, 2800 Software (C2800NM-ADVSECURITYK9-M), Version 15.1(4)M10, RELEASE SOFTWARE (fc2)
::::::::::::::
DeviceC
::::::::::::::
DeviceC#sh ver
Cisco IOS Software, C2960 Software (C2960-LANBASEK9-M), Version 12.2(55)SE8, RELEASE SOFTWARE (fc2)
EOF

# approved list
cat <<EOF >appr
Model 1841, Version 15.1(4)M7, 15.1(4)M10, or 15.2(1)T4 are approved.
Model 2800, Version 15.1(2)GC2, 15.1(4)M10, 15.1(4)M12a are approved.
Model C2960, Version 15.0(2)SE9 and 15.0(2)SE11 are approved.
EOF

# parse that appr list into "<mode> <version>\n" list
# get rid of all that "are approved." and "," and "Version" and "and" and "or"
# it's just lucky it works
<appr sed -e 's/Model \([^,]*\), Version \(.*\) are.*/\1 \2/' \
    -e 's/and//g' -e 's/or//' -e 's/, / /g' -e 's/[[:space:]]\+/ /g' |
# puff, I'm out of ideas, for each model and versions reformat the list
while IFS=", " read -r model versions; do
    while IFS=" " read -d' ' -r version; do
        printf "%s %s\n" "$model" "$version"
    done <<<"$versions"
done > ./appr2
# OK, after we have that, we can move on

#extract "<device>\n<model> <version>\n" from the list of devices
<file sed -n '/sh ver/s/\([^#]*\).*/\1/p; /Cisco/s/[^,]*, \([^ ]*\).*Version \([^,]*\).*/\1 \2/p' |
while 
    # simple read liine and line and model
    IFS= read -r device &&
    IFS=' ' read -r model version
do
    # because of it is formatted, that's pretty and simple
    if grep -q -f ./appr2 <<<"$model $version"; then
        approved_str=""
    else
        approved_str="NOT "
    fi

    # output
    printf "%s - Model %s - Version %s = %sOK\n" "$device" "$model" "$version" "$approved_str"
done        

выведет:

DeviceA - Model 1841 - Version 15.1(4)M10 = OK
DeviceB - Model 2800 - Version 15.1(4)M10 = OK
DeviceC - Model C2960 - Version 12.2(55)SE8 = NOT OK

После Model C2960 запятая отсутствует, я предположил, что это опечатка.

Худшая часть в скрипте - это разбор всех регулярных выражений. Это может легко сломаться, и я не знаю, для каких входов это будет работать. Если вы правильно отформатируете свои входные файлы, весь сценарий просто становится:

grep -q -f ./approved_list ./devices_list

с отл. ./approved_list отформатирован как разделенный новой строкой список <mode> <version>\n и ./devices_list отформатирован как <device> <mode> <version>\n.

0 голосов
/ 29 мая 2019

Вы можете сделать пользовательский одобренный.cfg следующим образом:

$ cat approved.cfg
1841.*Version 15.1\(4\)M7
2800.*Version 15.1\(2\)GC2
C2960.*Version 15.0\(2\)SE9
1841.*Version 15.1\(4\)M10
2800.*Version 15.1\(4\)M10
C2960.*Version 15.0\(2\)SE11
1841.*Version 15.2\(1\)T4
2800.*Version 15.1\(4\\)M12a

Теперь вы можете использовать это для поиска на устройствах:

echo Hits
grep -Ef approved.cfg Device*
echo Noks
grep -vEf approved.cfg Device* | grep "Cisco IOS Software"

Вы можете настроить выход в соответствии стребование.
Измените approved.cfg

1841 - Version 15.1(4)M7
2800 - Version 15.1(2)GC2
C2960 - Version 15.0(2)SE9
1841 - Version 15.1(4)M10
2800 - Version 15.1(4)M10
C2960 - Version 15.0(2)SE11
1841 - Version 15.2(1)T4
2800 - Version 15.1(4)M12a

Сначала найдите рабочую команду sed:

grep -H "Cisco IOS" Device* | 
   sed -r 's/([^:]*):[^,]*, ([^ ]*).*Version ([^,]*).*/\1 - Model \2 - Version \3/'

Теперь вы можете использовать это с

grep -H "Cisco IOS" Device* |
   sed -r 's/([^:]*):[^,]*, ([^ ]*).*Version ([^,]*).*/\1 - Model \2 - Version \3/' |
   grep -Fvf approved.cfg |
   sed 's/$/ = NOT OK/'

grep -H "Cisco IOS" Device* |
   sed -r 's/([^:]*):[^,]*, ([^ ]*).*Version ([^,]*).*/\1 - Model \2 - Version \3/' |
   grep -Ff approved.cfg |
   sed 's/$/ = OK/'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...