解析数百个包含数字的.txt文件,然后求和

时间:2019-04-02 13:00:42

标签: powershell loops parsing

我有一个脚本,可以在成千上万的服务器上运行,该脚本从日志中编译关键字并输出它们在文本文件中出现的次数。我使用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,但是没有找到想要的结果。

因此,我需要一个脚本,该脚本将循环并解析每个文件,并找到每个文件的总和(server1将具有自己的结果,server2将具有自己的结果)。如果脚本将文件名添加到结果中,这也将很有帮助。我正在寻找的结果:

server1_results.txt : 22

3 个答案:

答案 0 :(得分:1)

这对我有用

$Files = (Get-ChildItem c:\scripts\*.txt).FullName
$count=0
foreach ($File in $Files)
{
    $thisCount = Get-Content $File
    $Count = $Count + $thisCount
}
"Total Count is: $Count"

答案 1 :(得分:0)

我相信这会满足您的要求:

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
}

您有绩效目标吗?

答案 2 :(得分:0)

与我的批处理答案非常相似的powershell脚本
Parsing multiple text files with alternate file names, finding sum, and then compiling output with Batch file

## 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