这显示了一个.log文件的内容,该文件记录了特定供应商许可证的使用情况。例如,从日志中,您可以看到username_1当前正在使用许可证1、2和amp;3.
14:22:49(供应商)输出:"许可证_1"username_1@server45914:22:49(供应商)输出:"许可证_2"username_1@server45914:22:49(供应商)输出:"许可证_3"username_1@server45914:22:49(供应商)输出:"许可证_1"username_2@server45914:22:49(供应商)输出:"许可证_2"username_2@server45914:22:49(供应商)输出:"许可证_3"username_2@server45914:22:49(供应商)输出:"许可证_1"username_3@server45914:46:32(供应商)输出:"许可证_2"username_3@server45914:46:32(供应商)输出:"许可证_3"username_3@server45914:47:40(供应商)输出:"许可证_3"username_4@server459
我想创建一个输出,显示每个许可证中有多少在使用,并排除所有不必要的数据。我设想这样的东西:
许可证_1:3许可证_2:3许可证_3:4
假设许可证是双引号中唯一的元素,则可以使用类似这样的正则表达式:
Select-String YourFile.log -Pattern '(?<=")[^"]+(?=")' | % {
$_.Matches.value
} | Group-Object | % {"$($_.name): $($_.count)"}
Dave Sexton答案的变体,使用-replace
运算符从日志文件内容中提取许可证子字符串:
(Get-Content 'C:pathtoyour.log') -replace '.*"(license_d+)".*','$1' |
Group-Object |
Select-Object Name, Count
这将以表格形式提供许可证计数。你可以通过管道将其输送到Format-Table
中,使其更加浓缩:
... | Format-Table -AutoSize
如果你喜欢问题中的自定义格式,你可以使用格式运算符(-f
),如下所示:
... | ForEach-Object { '{0}: {1}' -f $_.Name, $_.Count }
如果你的日志看起来总是一样的,并用[Space]分隔,那么你可以使用这个简单的操作:
$log = Get-Content C:yourlog.txt
$Array = @()
Foreach ($line in $log)
{
$Result = "" | Select Time,Vendor,"IN/OUT",License,Username
$Split = $line -split 's' | ? {$_}
$Result.Time = ($Split)[0]
$Result.Vendor = ($Split)[1]
$Result."IN/OUT" = ($Split)[2]
$Result.License = ($Split)[3]
$Result.Username = ($Split)[4]
$Array += $Result
}
然后,您可以按特定用户显示所有许可证:
$Array | ? {$_.Username -eq 'username_3@server459'} | Select -Expand License