Как извлечь информацию из текстового файла? - PullRequest
1 голос
/ 14 июня 2011

У меня есть серия файлов журнала (текстовый формат) с разных серверов со столбцами информации. У меня есть два скрипта PowerShell (ниже), которые ищут и вычисляют детали из определенных столбцов и выводят текстовый файл.

Скрипт № 1 (потерян объединенные пакеты RTP)

Этот скрипт будет смотреть на столбец «Подробности» в файле журнала и вычислять все «XX пакетов RTP были потеряны» (например, 57 пакетов RTP были потеряны)

Сценарий может быть выполнен в любом каталоге или папке, содержащей файлы (* .log), и даст вам общее количество потерянных пакетов RTP.

  $sum = 0 
  foreach ($i in dir -filter *.log -Rec)
  {
  $sum += (gc $i.fullname | select -Skip 5 | ConvertFrom-Csv -Delimiter "`t" | ? {$_.Details -  match "^(\d+)"} |% {$matches[1]} | Measure-Object -Sum).Sum
  }
  $sum | Tee-Object -FilePath .\CombinedResults.txt
  [Console]::Write("Press any key to continue . . . ")
  [Console]::ReadKey()

Скрипт № 2 (Всего пакетов RTP, потерянных сущностью)

Этот скрипт будет смотреть на столбец «Подробности» в файле журнала и вычислять все «XX RTP-пакетов, которые были потеряны» (например, 57 RTP-пакетов был потерян), чем покажет вам общее количество пакетов, потерянных на одну сущность (камеру), имя сущности находится в столбце «сущность».

Сценарий может быть выполнен в любом каталоге или папке, содержащей файлы (* .log), и предоставит вам общее количество пакетов RTP, потерянных на объект.

 $out=foreach ($i in dir -filter *.log -Rec)
 {
 $cameras = gc $i.fullname | select -Skip 5 | ConvertFrom-Csv -Delimiter "`t" | group "Entity "
 $cameras | select Name, @{n="Total";e={ ($_.group | ? {$_.Details -match "^(\d+)"} |% {$matches  [1]} | Measure-Object -Sum).Sum}} | ? {$_.Total -gt 0} 
 }
 $out | Tee-Object -FIlePath .\ByEntityResults.txt 
 [Console]::Write("Press any key to continue . . . ")
 [Console]::ReadKey()

Вот что я пытаюсь достичь:

Эти файлы журналов поступают с разных серверов, и я хочу, чтобы результаты фильтровались сервером. В файлах журналов в левом верхнем углу указано «Имя компьютера:»

Для обоих сценариев я бы хотел, чтобы результаты фильтровались по имени компьютера.

Пример конечного результата:

  Script # 1

 Computer Name: T3-Archiver22

 Total RTP Packet(s) lost = 43243



 Computer Name: T3-Archiver24

 Total RTP Packet(s) lost = 8837


 Script # 2

 Computer Name: T3-Archiver22


 Entity Name:                   Total RTP Packet(s) lost

 (7233)C2-GF-127 - 10.20.13.69(P)            54

  .

  .

  .


 Computer Name: T3-Archiver24

 Entity Name:             Total RTP Packet(s) lost

 (6547)U2 Z-C14                   27

 . 

 .

 .

1 Ответ

0 голосов
/ 14 июня 2011

Вместо накопления одного значения, такого как $ sum, вы можете накапливать суммы, связанные с именем сервера, используя хеш-таблицы (ассоциативные массивы, словари), а затем записывать собранные данные из таблицы в файл.

В этой ссылке есть несколько примеров использования хеш-таблицы:

Есть ли у powershell ассоциативные массивы?

...