从LOG/TXT文件创建输出



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

最新更新