Сохраненный формат вывода в столбцах [grep, sed, awk или?]

Я создал файл сценария ожидания, который подключается к нескольким коммутаторам +200 по telnet.

Мой код:

#!/usr/bin/expect -f
#Slurp up the input file
set fp [open "ip.txt" r]
# To avoid empty lines, 'nonewline' flag is used
set file_data [read -nonewline $fp]
close $fp
set prompt ">"
log_file -noappend switch_port_status.txt
foreach ip [split $file_data "\n"] {
puts "Switch $ip Interface Status"
spawn telnet $ip
expect "Username:"
send "MyUsername\r"
expect "assword:"
send "MyPassword\r"
expect $prompt
# To avoid sending 'Enter' key on huge configurations
send "show ip int br\r"
expect {
-ex "--More--" { send -- " "; exp_continue }
"*>" { send "exit\r" }
}
#expect $prompt
set timeout 1; # Reverting to default timeout
# Sending 'exit' at global level prompt will close the connection
expect eof

Для сценария Expect Script «log_file -noappend switch_port_status.txt» я сохранил выходной файл, как показано ниже:

Trying 192.168.0.1...
Connected to 192.168.0.1 (192.168.0.1).
Escape character is '^]'.

Authorized access only
This system is the property of Company Name
Disconnect IMMEDIATELY if you are not an authorized users!


User Access Verification

Username: MyUsername
Password:

Switch-hostname1>show ip int br
Interface              IP-Address  OK? Method          Status                 Protocol
Vlan1                  unassigned  YES  NVRAM          administratively down  down
Vlan308                192.168.0.1 YES  NVRAM          up                     up
Vlan603                unassigned  YES  NVRAM          administratively down  down
GigabitEthernet0/1     unassigned  YES  unset          up                     up
GigabitEthernet0/2     unassigned  YES  unset          down                   down
LongReachEthernet0/1   unassigned  YES   unset         administratively down  down
LongReachEthernet0/2   unassigned  YES   unset         administratively down  down
LongReachEthernet0/3   unassigned  YES   unset         administratively down  down
LongReachEthernet0/4   unassigned  YES   unset         administratively down  down
LongReachEthernet0/5   unassigned  YES   unset         administratively down  down
LongReachEthernet0/6   unassigned  YES   unset         up                     up
LongReachEthernet0/7   unassigned  YES   unset         up                     up
LongReachEthernet0/8   unassigned  YES   unset         administratively down  down
LongReachEthernet0/9   unassigned  YES   unset         administratively down  down
LongReachEthernet0/10 unassigned  YES   unset         up                     up
LongReachEthernet0/11 unassigned  YES   unset         administratively down  down
LongReachEthernet0/12 unassigned  YES   unset         administratively down  down
LongReachEthernet0/13 unassigned  YES   unset         administratively down  down
LongReachEthernet0/14 unassigned  YES   unset         administratively down  down
LongReachEthernet0/15 unassigned  YES   unset         administratively down  down
LongReachEthernet0/16 unassigned  YES   unset         up                     up
LongReachEthernet0/17 unassigned  YES   unset         administratively down  down
LongReachEthernet0/18 unassigned  YES   unset         administratively down  down
LongReachEthernet0/19 unassigned  YES   unset         administratively down  down
LongReachEthernet0/20 unassigned  YES   unset         up                     up
LongReachEthernet0/21 unassigned  YES   unset         administratively down  down
LongReachEthernet0/22 unassigned  YES   unset         administratively down  down
LongReachEthernet0/23 unassigned  YES   unset         administratively down  down
LongReachEthernet0/24 unassigned  YES   unset         administratively down  down
Switch-hostname1>exit
Connection closed by foreign host.
Trying 192.168.0.2...
Connected to 192.168.0.2 (192.168.0.2).
Escape character is '^]'.

Authorized access only
This system is the property of Company Name
Disconnect IMMEDIATELY if you are not an authorized users!


User Access Verification

Username: MyUsername
Password:

Switch-hostname2>show ip int br
Interface             IP-Address  OK? Method   Status                Protocol
Vlan1                 unassigned  YES NVRAM    administratively down down
Vlan308               192.168.0.2 YES NVRAM    up                    up
Vlan603               unassigned  YES NVRAM    administratively down down
GigabitEthernet0/1    unassigned  YES unset    up                    up
GigabitEthernet0/2    unassigned  YES unset    down                  down
LongReachEthernet0/1  unassigned  YES unset    administratively down down
LongReachEthernet0/2  unassigned  YES unset    administratively down down
LongReachEthernet0/3  unassigned  YES unset    administratively down down
LongReachEthernet0/4  unassigned  YES unset    down                  down
LongReachEthernet0/5  unassigned  YES unset    administratively down down
LongReachEthernet0/6  unassigned  YES unset    administratively down down
LongReachEthernet0/7  unassigned  YES unset    administratively down down
LongReachEthernet0/8  unassigned  YES unset    administratively down down
LongReachEthernet0/9  unassigned  YES unset    administratively down down
LongReachEthernet0/10 unassigned YES unset     administratively down down
LongReachEthernet0/11 unassigned YES unset     administratively down down
LongReachEthernet0/12 unassigned YES unset     administratively down down
LongReachEthernet0/13 unassigned YES unset     administratively down down
LongReachEthernet0/14 unassigned YES unset     administratively down down
LongReachEthernet0/15 unassigned YES unset     administratively down down
LongReachEthernet0/16 unassigned YES unset     administratively down down
LongReachEthernet0/17 unassigned YES unset     administratively down down
LongReachEthernet0/18 unassigned YES unset     up up
LongReachEthernet0/19 unassigned YES unset     administratively down down
LongReachEthernet0/20 unassigned YES unset     administratively down down
LongReachEthernet0/21 unassigned YES unset     administratively down down
LongReachEthernet0/22 unassigned YES unset     up up
LongReachEthernet0/23 unassigned YES unset     administratively down down
LongReachEthernet0/24 unassigned YES unset     administratively down down
Switch-hostname2>Trying 192.168.0.3...
Connected to 192.168.0.3 (192.168.0.3).
Escape character is '^]'.

Authorized access only
This system is the property of Company Name
Disconnect IMMEDIATELY if you are not an authorized users!


User Access Verification

Username: MyUsername
Password:

Switch-hostname3#show ip int br
Interface            IP-Address  OK? Method     Status Protocol
Vlan1                192.168.0.3 YES NVRAM      up     up
FastEthernet0/1      unassigned  YES unset      up     up
FastEthernet0/2      unassigned  YES unset      up     up
FastEthernet0/3      unassigned  YES unset      up     up
FastEthernet0/4      unassigned  YES unset      up     up
FastEthernet0/5      unassigned  YES unset      up     up
FastEthernet0/6      unassigned  YES unset      up     up
FastEthernet0/7      unassigned  YES unset      up     up
FastEthernet0/8      unassigned  YES unset      down   down
FastEthernet0/9      unassigned  YES unset      down   down
FastEthernet0/10    unassigned  YES unset       down   down
FastEthernet0/11    unassigned  YES unset       down   down
FastEthernet0/12    unassigned  YES unset       down   down
FastEthernet0/13    unassigned  YES unset       down   down
FastEthernet0/14    unassigned  YES unset       down   down
FastEthernet0/15    unassigned  YES unset       down   down
FastEthernet0/16    unassigned  YES unset       down   down
FastEthernet0/17    unassigned  YES unset       down   down
FastEthernet0/18    unassigned  YES unset       down   down
FastEthernet0/19    unassigned  YES unset       down   down
FastEthernet0/20    unassigned  YES unset       down   down
FastEthernet0/21    unassigned  YES unset       down   down
FastEthernet0/22    unassigned  YES unset       up     up
FastEthernet0/23    unassigned  YES unset       down   down
FastEthernet0/24    unassigned  YES unset       down   down
GigabitEthernet0/1  unassigned  YES unset       up     up
GigabitEthernet0/2  unassigned  YES unset       down   down
Switch-hostname4>exit
Connection closed by foreign host.

Trying 192.168.0.4...
Connected to 192.168.0.4 (192.168.0.4).
Escape character is '^]'.

Authorized access only
This system is the property of Company Name
Disconnect IMMEDIATELY if you are not an authorized users!


User Access Verification

Username: MyUsername
Password:

Switch-hostname4#show ip int br

............так далее и так далее.

Можно ли это сделать с помощью утилиты awk / sed / grep в Linux ??

Желаемый выходной формат:

192.168.0.1
Switch-hostname1
Vlan1,administratively down
Vlan308,up 
Vlan603,administratively down
GigabitEthernet0/1,up 
GigabitEthernet0/2 ,down
LongReachEthernet0/1,administratively down
LongReachEthernet0/2,administratively down
LongReachEthernet0/3,administratively down
LongReachEthernet0/4,administratively down
LongReachEthernet0/5,administratively down
LongReachEthernet0/6,up
LongReachEthernet0/7,up
LongReachEthernet0/8,administratively down
LongReachEthernet0/9,administratively down
LongReachEthernet0/10,up
LongReachEthernet0/11,administratively down
LongReachEthernet0/12,administratively down
LongReachEthernet0/13,administratively down
LongReachEthernet0/14,administratively down
LongReachEthernet0/15,administratively down
LongReachEthernet0/16,up
LongReachEthernet0/17,administratively down
LongReachEthernet0/18,administratively down
LongReachEthernet0/19,administratively down
LongReachEthernet0/20,up
LongReachEthernet0/21,administratively down
LongReachEthernet0/22,administratively down
LongReachEthernet0/23,administratively down
LongReachEthernet0/24,administratively down

192.168.0.2
Switch-hostname2
Vlan1,administratively
Vlan308,up
Vlan603,administratively
GigabitEthernet0/1,up
GigabitEthernet0/2,down
LongReachEthernet0/1,administratively
LongReachEthernet0/2,administratively
LongReachEthernet0/3,administratively
LongReachEthernet0/4,down
LongReachEthernet0/5,administratively
LongReachEthernet0/6,administratively
LongReachEthernet0/7,administratively
LongReachEthernet0/8,administratively
LongReachEthernet0/9,administratively
LongReachEthernet0/10,administratively
LongReachEthernet0/11,administratively
LongReachEthernet0/12,administratively
LongReachEthernet0/13,administratively
LongReachEthernet0/14,administratively
LongReachEthernet0/15,administratively
LongReachEthernet0/16,administratively
LongReachEthernet0/17,administratively
LongReachEthernet0/18,up
LongReachEthernet0/19,administratively
LongReachEthernet0/20,administratively
LongReachEthernet0/21,administratively
LongReachEthernet0/22,up
LongReachEthernet0/23,administratively
LongReachEthernet0/24,administratively

192.168.0.3
Switch-hostname3
Vlan1,up
FastEthernet0/1,up
FastEthernet0/2,up
FastEthernet0/3,up
FastEthernet0/4,up
FastEthernet0/5,up
FastEthernet0/6,up
FastEthernet0/7,up
FastEthernet0/8,down
FastEthernet0/9,down
FastEthernet0/10,down
FastEthernet0/11,down
FastEthernet0/12,down
FastEthernet0/13,down
FastEthernet0/14,down
FastEthernet0/15,down
FastEthernet0/16,down
FastEthernet0/17,down
FastEthernet0/18,down
FastEthernet0/19,down
FastEthernet0/20,down
FastEthernet0/21,down
FastEthernet0/22,up
FastEthernet0/23,down
FastEthernet0/24,down
GigabitEthernet0/1,up
GigabitEthernet0/2,down

192.168.0.4
Switch-hostname4

............так далее и так далее.

Заранее благодарны за Вашу помощь.


person Danny Luk    schedule 04.06.2015    source источник
comment
очень исчерпывающий, но немного объемный (по информации) для простого переформатирования   -  person NeronLeVelu    schedule 04.06.2015
comment
Ваш вывод является полным или отфильтрованным, например, нет выхода из 192.168.0.2, но для другого хорошо, .... Другими словами, каковы ваши критерии, чтобы взять строки и переформатировать их?   -  person NeronLeVelu    schedule 04.06.2015
comment
Вывод полный, он автоматически выводит вот так. Мы должны опустить следующие слова, если предполагаем, что есть выход: 『Попытка IP-адреса ... Подключено к IP-адресу (IP-адресу). Экранирующий символ - '^]'. Только авторизованный доступ. Эта система является собственностью Company Name Disconnect НЕМЕДЛЕННО, если вы не являетесь авторизованным пользователем! Проверка доступа пользователя Имя пользователя: MyUsername Пароль: 』『 ›show ip int br』 『› exit Соединение закрыто внешним хостом. 』   -  person Danny Luk    schedule 04.06.2015
comment
Только IP, имя хоста, интерфейс и статус необходимы для получения состояния выходного файла, как указано в моем сообщении. Могу ли я отредактировать сценарий ожидания, чтобы преобразовать выходной файл в желаемый формат вывода, указанный выше? Или мне нужно открыть другой файл perl?   -  person Danny Luk    schedule 04.06.2015


Ответы (2)


Что касается реализации perl, я бы предложил следующее:

#!/usr/bin/perl -nl

print "\n$1" if (/Connected to (\S+)/);
if ($line_num = (/^(\S+?)(?:>|#)show ip int br/ ... /^.*?(?:>|#)/)) {
    if ($line_num == 1) {
        print $1;
    } elsif ($line_num > 2 && /^(\S+)\s+\S+\s+\S+\s+\S+\s+(.*)\s+\S+$/)  {
        print "$1;$2";
    } elsif ($line_num > 2 && /^\s*$/)  {   # retian empty lines after 
                                            # 'show ip int br' if there are any
        print;
    }
}

Использование: squeeze.pl your_swicth_status_script_output.txt, где squeeze.pl - имя приведенного выше сценария.

person Dmitry Egorov    schedule 04.06.2015
comment
Я изменил сценарий, чтобы учесть различные символы подсказки и потенциально отсутствующие команды выхода. - person Dmitry Egorov; 04.06.2015
comment
Предоставленный вами сценарий работает, но есть еще одна проблема. Когда я вернусь к переключателю с опубликованной копией скрипта, я могу получить ожидаемый результат, используя предоставленный вами perl, как показано. Но строки не разделяются после show ip interfacerief, если я использовал тот же perl для запуска выходного файла в предыдущем переключателе. Я попытался отредактировать, но безуспешно, пожалуйста, подскажите, как мне внести поправки. Большое спасибо. - person Danny Luk; 07.06.2015
comment
[Форматировать как мое сообщение]: (i109.photobucket.com/ альбомы / n73 / CyberLuk /) [Работа со сценарием]: (i109.photobucket.com/albums/n73/CyberLuk/) [Исходный формат в переключателе]: (i109.photobucket.com/albums/n73/CyberLuk/) [Отображать только IP-адрес и имя хоста]: (i109.photobucket.com/albums/n73/CyberLuk/) [Ссылка для скачивания исходный выходной файл]: (drive.google.com/file/d/ 0B0tUlNEULMxqZkt2WXZwcnVWcWc /) - person Danny Luk; 07.06.2015
comment
Привет, @DannyLuk! Правильно ли я понимаю, что вам нужно сохранить пустые строки в таблице интерфейса, если они есть? Если да, используйте обновленную версию скрипта из ответа. В противном случае не могли бы вы более подробно изложить свои требования? - person Dmitry Egorov; 08.06.2015
comment
Большое спасибо! Желаемый выходной формат как в моем посте. Это моя проблема с форматом сообщения, когда я возвращаюсь к коммутатору с опубликованной мной копией сценария. Проблема устранена из-за того, что $. - person Danny Luk; 08.06.2015

@ Дмитрий Егоров Большое спасибо!
Желаемый формат вывода как в моем посте. Это моя проблема с форматом сообщения, когда я возвращаюсь к переключателю с опубликованной мной копией сценария. Проблема решена из-за того, что не используется «$».

Ваш предыдущий код:

#!/usr/bin/perl -nl

print "\n$1" if (/Connected to (\S+)/);
if ($line_num = (/^(\S+?)(?:>|#)show ip int br/ ... /^.*?(?:>|#)/)) {
    if ($line_num == 1) {
        print $1;
    } elsif ($line_num > 2 && /^(\S+)\s+\S+\s+\S+\s+\S+\s+(.*)\s+\S+$/) {
        print "$1;$2";
    }
}

Мой текущий код:

#!/usr/bin/perl -nl

print "\n$1" if (/Connected to (\S+)/);
if ($line_num = (/^(\S+?)(?:>|#)show ip int br/ ... /^.*?(?:>|#)/)) {
    if ($line_num == 1) {
        print $1;
    } elsif ($line_num > 2 && /^(\S+)\s+\S+\s+\S+\s+\S+\s+(.*)\s+\S+/)  {
        print "$1;$2";
    }
}
person Danny Luk    schedule 08.06.2015