从LOG / TXT文件创建输出

时间:2016-01-07 09:47:04

标签: powershell powershell-v4.0 powershell-ise

这显示了.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

3 个答案:

答案 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