这显示了.log文件的内容,该文件记录了特定供应商使用的许可证。例如,您可以在日志中看到username_1当前正在使用许可证1,2和& 3。
14:22:49 (VENDOR) OUT: "License_1" username_1@server459 14:22:49 (VENDOR) OUT: "License_2" username_1@server459 14:22:49 (VENDOR) OUT: "License_3" username_1@server459 14:22:49 (VENDOR) OUT: "License_1" username_2@server459 14:22:49 (VENDOR) OUT: "License_2" username_2@server459 14:22:49 (VENDOR) OUT: "License_3" username_2@server459 14:22:49 (VENDOR) OUT: "License_1" username_3@server459 14:46:32 (VENDOR) OUT: "License_2" username_3@server459 14:46:32 (VENDOR) OUT: "License_3" username_3@server459 14:47:40 (VENDOR) OUT: "License_3" username_4@server459
我想创建一个输出,显示每个许可证的使用量,并排除所有不必要的数据。我设想这样的事情:
License_1: 3 License_2: 3 License_3: 4
答案 0 :(得分:2)
假设许可证是双引号中的唯一元素,您可以像这样使用正则表达式:
Select-String YourFile.log -Pattern '(?<=")[^"]+(?=")' | % {
$_.Matches.value
} | Group-Object | % {"$($_.name): $($_.count)"}
答案 1 :(得分:2)
Dave Sexton's的变体使用-replace
运算符从日志文件内容中提取许可证子字符串:
(Get-Content 'C:\path\to\your.log') -replace '.*"(license_\d+)".*','$1' |
Group-Object |
Select-Object Name, Count
这将以表格格式为您提供许可证计数。您可以将其传输到Format-Table
以使其更加精简:
... | Format-Table -AutoSize
如果您更喜欢问题中的自定义格式,可以使用format operator(-f
),如下所示:
... | ForEach-Object { '{0}: {1}' -f $_.Name, $_.Count }
答案 2 :(得分:1)
如果您的日志看起来总是相同并且用[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