计算正则表达式的出现次数并输出到CSV

时间:2017-02-24 12:09:08

标签: powershell

我希望使用带有正则表达式模式的Powershell,它将计算文本文件中该模式的出现次数。可以在一条线上或多条线上重复出现。

输出必须是带计数的直方图。

使用Powershell, Counting string ocurrences in a text file我能够让它工作但是意识到它只能在每行的基础上工作(例如,当找到匹配时它会计数1但是如果在线上有多次出现则这是不正确的)

来源可能看起来像这样

Lorem Ipsum Lorem Ipsum Ipsum user:john
Lorem Ipsum user:peter
Lorem Ipsum Lorem Ipsum user:george
Lorem Ipsum user:john user:john user: john user:johnasddaasd user:john
Lorem Ipsum  vLorem Ipsum user: george
Lorem Ipsum user:john

我目前有一个基于每行工作的脚本 - 但不适用于线路上有多个匹配项的上述示例

function GetUserCounts($fileName)
{
  $msgCounts = @{}

  switch -regex -file $fileName
  {
    '\buser:([a-zA-Z]+)\b' {
       $msgType = $matches[1]
       $msgCounts[$msgType] = [int]$msgCounts[$msgType] + 1
    }
  }

  $msgCounts.GetEnumerator() | select Name,Value
}

$currentDate = (Get-Date -Format "yyyy-MM-dd HH:mm:ss")

$inputFile=$args[0]

GetUserCounts $inputFile | Export-Csv .\counts.csv -NoTypeInformation

import-csv .\counts.csv |
Select-Object *,@{Name='Filename';Expression={$inputFile}},@{Name='Rundate';Expression={$currentDate}} | 
export-csv msgCounts.csv -NoTypeInformation
Remove-Item .\counts.csv

有人可以帮助我让这个示例在文本文件中的任何位置工作吗?

更新 输出看起来像

Name , Count
john, 6
peter, 1
george, 2

1 个答案:

答案 0 :(得分:2)

您必须在每个开关盒内进行另一次测试。一个简单的方法是简单地拆分字符串并计算结果 - 1:

        var messageString = JsonConvert.SerializeObject(AzureBmp280Data);
        Debug.WriteLine("Message Sent: {0}", messageString, null);
        var message = new Message(Encoding.ASCII.GetBytes(messageString));
        message.Properties.Add("level", "critical");

或者使用switch -regex -file $fileName { '\buser:([a-zA-Z]+)\b' { $msgType = $matches[1] $msgCount = ($_ -split [regex]::Escape($msgType)).Count - 1 [int]$msgCounts[$msgType] += $msgCount } } Select-String参数切换并在生成的-AllMatches中捕获的群组:

Matches

如果要包含前面有空格的用户名

,请将模式更改为(Select-String -Path .\test.txt '\buser:([a-zA-Z]+)\b' -AllMatches).Matches |ForEach-Object { $_.Groups[1].Value } |Group -NoElement