Разбор сотен файлов .txt, которые содержат числа, а затем поиск суммы - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть скрипт, который я запускаю на тысячах серверов, который компилирует ключевые слова из журналов и выводит, сколько раз они встречаются в текстовом файле. Я использую xcopy, чтобы поймать логи прямо в коробку и поместить их в одну папку. (IE: в C: \ scripts \ содержит server1_results.txt, server2_results.txt и т. Д.) Вывод выглядит так для каждого отдельного сервера:

---------- C:\TEMP\TEXT.001: 0
---------- C:\TEMP\TEXT.002: 0
---------- C:\TEMP\TEXT.003: 2
---------- C:\TEMP\TEXT.004: 0
---------- C:\TEMP\TEXT.005: 1

Число после двоеточия - это количество раз, когда ключевое слово появляется в журнале. Затем я использую пакетный скрипт, чтобы разобрать все перед окончательным числом, а затем добавить итог, после чего результаты экспортируются в новый текстовый файл.

Мой метод работает нормально, однако у меня есть сотни журналов, и мой сценарий работает только с одним журналом - по одному за раз.

Я играл с Get-Content, но не нашел нужных результатов.

Итак, мне нужен скрипт, который будет зацикливать и анализировать каждый файл и находить общую сумму для каждого отдельного файла (сервер1 будет иметь свой собственный результат, сервер2 будет иметь свой собственный результат). Также было бы полезно, если бы скрипт добавил имя файла к результату. Результат, который я ищу:

server1_results.txt : 22

Ответы [ 3 ]

1 голос
/ 02 апреля 2019

Это работает для меня

$Files = (Get-ChildItem c:\scripts\*.txt).FullName
$count=0
foreach ($File in $Files)
{
    $thisCount = Get-Content $File
    $Count = $Count + $thisCount
}
"Total Count is: $Count"
0 голосов
/ 02 апреля 2019

Сценарий powershell, очень похожий на мой пакетный ответ в
. Анализ нескольких текстовых файлов с альтернативными именами файлов, поиск суммы, а затем компиляция вывода с использованием пакетного файла

## Q:\Test\2019\04\02\SO_55475471.ps1

$Folder = 'X:\path\to\files'

$HashTable = @{}
foreach ($File in (Get-ChildItem -Path $Folder -Filter *_count.txt -File)){
  Select-String -Path $File -Pattern '(?<=-{5,}.*)\d+$' | ForEach-Object {
    $HashTable[$File.BaseName]+= [int]$_.Matches[0].Value
  }
}
$HashTable

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

> Q:\Test\2019\04\02\SO_55475471.ps1

Name                           Value
----                           -----
server1_count                  3
server2_count                  15

PS: просто измените *_count.txt => *_results.txt

Чтобы получить статистику:

> $HashTable.GetEnumerator()|Measure-Object Value -sum -ave -min -max

Count    : 2
Average  : 9
Sum      : 18
Maximum  : 15
Minimum  : 3
Property : Value
0 голосов
/ 02 апреля 2019

Я верю, что это достигнет того, что вы хотите:

foreach ($file in (Get-ChildItem "C:\scripts\*_results.txt")) {
    $Sum = 0
    switch -regex -file $file
    {
        "[1-9]\d*$" {$sum += $matches[0] -as [int]}
    }
    "{0} : {1}" -f $file.name,$sum
}

Есть ли у вас какие-либо цели?

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