我确定在某个地方以前已经回答了这个问题,但是尽管让自己发疯了我似乎无法找到它。对Powershell和编码总体而言,任何批评都欢迎。
我想查看一系列日志并输出日志名称,后跟字符串被找到的次数或包含某个字符串的行数。要么应该工作。
我现在所拥有的是以下内容
$logsToCheck = "F:\errlog1.txt",
"F:\errlog2.txt"
$errMatches = foreach($log in $logsToCheck)
{Write-Host $log; Select-String -Path $log -Pattern "ERRORBAD"}
$errMatches
我的目标就是输出日志名称和错误数量,例如:
F:\errlog1.txt
12
F:\errlog2.txt
7
我想过为我的循环中的每个日志创建变量并打印路径名,然后是
$countErrLog1 = Select-String -Path F:\errlog1.txt -Pattern "ERRORBAD"
$countErrLog1.Matches.Count
但这似乎相当多余。
所以我最终要找的是如何将多个语句传递给管道中的单个变量,然后再转到管道中的下一个变量。
提前致谢。
答案 0 :(得分:1)
Select-String
和Group-Object
非常容易。
$logsToCheck = "F:\errlog1.txt",
"F:\errlog2.txt"
Select-String -Path $logsToCheck -Pattern 'ERRORBAD' |
Group Path |
Select Count,Name
这将输出如下内容:
Count Name
----- ----
12 F:\errlog1.txt
7 F:\errlog2.txt
答案 1 :(得分:0)
你实际上已经非常接近了。需要考虑的是Count如果为零则返回NOTHING,因此您需要使用@()
强制PowerShell为您提供数组。
以下是我使用的代码:
$logsToCheck = "test.txt","test2.txt"
foreach($log in $logsToCheck)
{
$matchInfo = @(Select-String -Path $log -Pattern "ERROR")
Write-Host $log $matchInfo.Count
}
的test.txt:
ERROR
GOOD
GOOD
ERROR
ERROR
text2.txt
GOOD
GOOD
GOOD
GOOD
GOOD
我的结果:
test.txt 3
test2.txt 0