我正在使用 PowerShell 查看 IIS 日志,并且需要统计每个日志文件的 500 个错误。
我用过:
dir $logpath -recursive | select-string -pattern ' 500 ' | measure-object
但这可以让我得到所有文件的总数。我需要每个文件的计数。
有什么想法吗?
select-String 匹配公开一个 Path 属性,您可以使用该属性进行分组:
dir $logpath -recursive | select-string -pattern ' 500 ' | group path
grep -c
计数为零的文件:
上一个答案中的
| group path
方法 [https://stackoverflow.com/a/13648613/4582204] 以及 | group path | ft Count,Name
格式修复 [https://stackoverflow.com/questions/13648546/find-strings-in -multiple-files-and-give-count-per-file#comment128350982_13648613] 非常接近 Linux/unix grep -c
等效项,这是 powershell 中所缺少的。我不明白为什么没有Select-String -Count
。看起来很简单。
但是,仍然存在一个差异。
Linux/unix
grep -c
将列出每个文件,包括那些计数为零的文件。
echo "Hello World" > tmp.txt;
echo "hxllo world" > tmp2.txt
grep -cHi hello tmp*.txt
产生:
tmp.txt:1
tmp2.txt:0
[在 https://www.onlinegdb.com/online_bash_shell 上测试仅供参考]
鉴于
Get-ChildItem -File | Select-String 'hello' | group path | ft count, name
另一方面,产生
Count Name
----- ----
1 C:\Users\username\tmp.txt
tmp2.txt
不报告没有匹配的内容。
我能想到的唯一方法是自己迭代文件。我提供:
foreach ($file in Get-ChildItem -File) {
"$($file):$((Select-String "hello" $file).Count)"
}
或者单行(可能会从右侧溢出屏幕):
foreach ($file in Get-ChildItem -File) { "$($file):$((Select-String "hello" $file).Count)" }
这会产生类似
grep -c
: 的输出
tmp.txt:1
tmp2.txt:0
您可以将
-Recurse
添加到 Get-ChildItem
中,并在子目录中获得相同的效果。