Как извлечь один шаблон из текстового файла перед циклом foreach в powershell - PullRequest
0 голосов
/ 25 февраля 2019

Я хочу извлечь строку с именем хоста из файла.Файлы, которые я ищу, являются журналами от различных сетевых коммутаторов.Я хочу извлечь имя хоста из каждого журнала, затем я хочу вернуть каждое имя порта и ошибку crc для порта.

Вот код и образец журнала ниже кода.Я выделил строки, которые я вытаскиваю из файлов журнала.

# This pulls the port numbers out of each file
[string[]]$port_counter = Select-String -Path C:\Users\tlyle\OneDrive\Documents\Log\*.txt -Pattern 'is up', 'is down'

 # this pulls the crc errors out of each file
[string[]]$crc_logs = Select-String -Path C:\Users\tlyle\OneDrive\Documents\Log\*.txt -Pattern 'crc'  

# Below I combine the arrays and print them out
$MaxLen = [Math]::Max($port_counter.Length, $crc_logs.Length)

$Result = @()

for ($i = 0; $i -lt $MaxLen; $i++) { 
$Result += $port_counter[$i]
$Result += $crc_logs[$i]
}

$Result

Это в настоящее время требует от меня.

: GigabitEthernet1 / 1/1 работает, линейный протокол работает

: 0 ошибок ввода, 0 CRC, 0кадр, 0 игнорируется

: GigabitEthernet1 / 1/2 работает, линейный протокол работает

0 ошибок ввода, 0 CRC, 0 кадр, 0 игнорируется

, затем повторяется длякаждый файл в папке.

Вот как выглядит входной файл - Каждый файл имеет 48 портов - GigabitEthernet1 / 1/1 до 1/1/48 - я вытягиваю 2 строки для каждого порта в файле - выделено жирным шрифтом ниже - и сделайте это для каждого файла в каталоге .. Я хочу вытащитьпервая строка файла и возвращает ее перед информацией о порте и crc - для каждого файла - сначала будет показано имя хоста, затем ошибки портов и crc, затем перейдет к следующему файлу и покажет имя хоста один раз, затемпорты и ошибки CRC.,

Результаты команды "sh interfaces", отправленной на хост "10.16.156.76":

GigabitEthernet1 / 1/1 работает, линейный протокол работает
Портв течение 490 дней 3 часа 48 минут 56 секунд
Аппаратное обеспечение - GigabitEthernet, адрес - 609c.9f77.2d44 (bia 609c.9f77.2d44)
Автоматическая настройка скоростифактический 1 Гбит, настроенный дуплексный fdx, фактический fdx
Сконфигурированный режим mdi AUTO, фактический MDI
EEE Функция отключена
Член L2 VLAN ID 281, порт не помечен, состояние порта FORWARDING
Защита BPDUВключено, ROOT-защита отключена, Назначенная защита отключена
Включено подавление ошибок канала
STP настроен на ВКЛ, приоритет - level0, Mac-Learning включен
Обнаружение петли ВКЛЮЧЕНО
Flow Control is configвключено, оператор включен, согласование отключено
Зеркало отключено, монитор отключен
Mac-уведомление отключено
Не участвует ни в одном активном соединении
Не входит ни в один из настроенных соединительных линий
Имя порта - dev-wap
IPG MII 0 битов времени, IPG GMII 0 битов времени
MTU 10200 байтов
300 секунд скорость ввода: 21600 бит / с, 13 пакетов / сек, использование 0,00%
300 секунд скорость вывода: 126592 бит / с, 17 пакетов / с, загрузка 0,01%
1078349 пакетов ввода, 213724458 байтов, 0 без буфера
Получено 0 широковещательных рассылок, 3719 многоадресных рассылок, 1074630 одноадресных рассылок
0 ошибок ввода, 0CRC, 0 фрейм, 0 игнорируется
0 рун, 0 гигантов
1884404 выходных пакетов, 2300283173 байта, 0 опустошений
Передано 85 широковещательных сообщений, 138932 многоадресных рассылки, 1745387 одноадресных рассылок
0 ошибок вывода, 0коллизии
Параметр «Информация об агенте ретрансляции»: отключено

UC Очереди выхода:
Счетчики очереди Пакеты в очереди Отброшенные пакеты
0 1733399 0
1 1381 0
2 14 0
3 6245 0
4 1194 0
5 7 0
6 105 0
7 58847 0

MC Очереди на выход:
Счетчики очереди Пакеты в очереди Отброшенные пакеты
082570 0
1 25 0
2 595 0
3 23 0


GigabitEthernet1 / 1/2 работает, линейный протокол работает
Порт работает в течение 473 дней 9 часов 17 минут 50 секунд
Аппаратное обеспечение - GigabitEthernet, адрес - 609c.9f77.2d45 (bia 609c.9f77.2d45)
Настроенная скоростьавтоматический, фактический 1 Гбит, настроенный дуплексный fdx, фактический fdx
Сконфигурированный режим mdi AUTO, фактический MDIX
Функция EEE отключена
Член L2 VLAN ID 281, порт не помечен, состояние порта FORWARDING
защита BPDUВключено, ROOT-защита отключена, Назначенная защита отключена
Включено демпфирование ошибки соединения
STP настроен на ON, приоритет - level0, Mac-Learning включен
Обнаружение петли ВКЛЮЧЕНО
Flow Control isconfig включен, oper включен, согласование отключено
Зеркало отключено, монитор отключен
Mac-уведомление отключено
Не участвует ни в каких активных транках
Не является членом ни одного из настроенных транков
Имя порта - dev-wap
IPG MII 0 битов времени, IPG GMII 0 битов времени
MTU 10200 байтов
300 секунд Скорость ввода: 4704 бит / с, 2 пакета / с, загрузка 0,00%
Скорость вывода 300 секунд: 5320 бит / с, 3 пакета / с, загрузка 0,00%
170203 входных пакета, 37873738 байт, 0 без буфера
Получено 0 широковещательных рассылок, 3720 многоадресных рассылок, 166483 одноадресных рассылок
0ошибки ввода, 0 CRC, 0 фрейм, 0 игнорируется
0 рун, 0 гигантов
365548 выходных пакетов, 160575794 байта, 0 опустошений
Передано 85 широковещательных сообщений, 138931 многоадресных передач, 226532 одноадресных передач
0ошибки вывода, 0 коллизий
Параметр Информация агента ретрансляции: Отключено

Очереди выхода UC:
Счетчики очереди Пакеты в очереди Отброшенные пакеты
0 220453 0
1 83 0
2 10
3 641 0
4 973 0
5 3717 0
6 46 0
7 56422 0

MC Очереди на выход:
Счетчики очереди Пакеты в очереди Отброшенные пакеты
0 82569 0
1 25 0
2 595 0
3 23 0


ЗДЕСЬ ЧТО Я ХОЧУ, ЧТО ХОЧУ В КОНЦЕ РЕЗУЛЬТАТ БЫТЬ:

хост "10.16.156.76"

: GigabitEthernet1 / 1/1 подключен, линия протоcol up
: 0 ошибок ввода, 0 CRC, 0 кадров, 0 игнорируется

: GigabitEthernet1 / 1/2 работает, линейный протокол активирован
0 ошибок ввода, 0 CRC, 0 кадров, 0 игнорируется

и повторяется для каждого файла в папке.

1 Ответ

0 голосов
/ 25 февраля 2019

Вы слишком усложняете это.

Вы должны иметь возможность использовать сопоставление RegEx или Select-String с шаблоном RegEx, чтобы просто взять две строки с текстом, который вы ищете.

Я просто скопировал ваш пример журнала, сохранил его как один текстовый файл и просто сделал следующее.

Пример:

# Use RegEx matches to match / select the line that contains the
Get-Content -Path 'D:\Temp\Backup\RouterLog.txt' | 
%{[regex]::Matches($PSItem,'^.*\b(protocol|CRC)\b.*$').Value}

# Use Select-String RegEx to match / select the line that contains the pattern 
Get-Content -Path 'D:\Temp\Backup\RouterLog.txt' | 
Select-String '^.*\b(protocol|CRC)\b.*$'

# Results of both is

GigabitEthernet1/1/1 is up, line protocol is up
0 input errors, 0 CRC, 0 frame, 0 ignored
GigabitEthernet1/1/2 is up, line protocol is up
0 input errors, 0 CRC, 0 frame, 0 ignored

Конечно, вы можете просто ForLoop отдельные файлы, как вы, кажется,скажи, что ты уже делаешь.

...