我希望使用带有正则表达式模式的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
答案 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