在多个文件中查找字符串并给出每个文件的计数

问题描述 投票:0回答:2

我正在使用 PowerShell 查看 IIS 日志,并且需要统计每个日志文件的 500 个错误。

我用过:

dir $logpath -recursive | select-string -pattern ' 500 ' | measure-object 

但这可以让我得到所有文件的总数。我需要每个文件的计数。

有什么想法吗?

parsing powershell logfile
2个回答
2
投票

select-String 匹配公开一个 Path 属性,您可以使用该属性进行分组:

dir $logpath -recursive | select-string -pattern ' 500 ' | group path

0
投票

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
中,并在子目录中获得相同的效果。

© www.soinside.com 2019 - 2024. All rights reserved.