从 LOG/TXT 文件创建输出

Create Output from LOG/TXT file

这显示了记录特定供应商许可证使用情况的 .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

如果您的日志总是看起来相同并用 [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

假设许可证是双引号中唯一的元素,您可以像这样使用正则表达式:

Select-String YourFile.log -Pattern '(?<=")[^"]+(?=")' | % {
  $_.Matches.value
} | Group-Object | % {"$($_.name): $($_.count)"}

答案的变体,使用 -replace 运算符从日志文件内容中提取许可证子字符串:

(Get-Content 'C:\path\to\your.log') -replace '.*"(license_\d+)".*','' |
  Group-Object |
  Select-Object Name, Count

这将为您提供表格格式的许可证计数。您可以将其通过管道传输到 Format-Table 以使其更紧凑:

... | Format-Table -AutoSize

如果您更喜欢问题中的自定义格式,可以像这样使用 format operator (-f):

... | ForEach-Object { '{0}: {1}' -f $_.Name, $_.Count }