首页 > 解决方案 > 在文件中搜索子字符串,但只检查前几个字符

问题描述

我有一个要搜索的关键字列表,例如FOO, BAR, BAZ,以及大量各种大小的文件,其中可能包括文件开头的上述关键字之一。这样的文件可能如下所示:

AAA:+.? 'BBB+1234567890000+9999999999999+FOO'CCC+...

这些是'- 分隔的段。我要搜索的关键字只能出现在第二段(BBB-part)中,所以我可以分割'或只搜索前 100 个字节左右。它不必精确,误报也不是问题。

默认情况下,我只能使用 Windows 上可用的工具,所以我认为 Powershell 是最好的选择。我可以使用Select-String执行全文搜索,但鉴于许多文件的大小非常大,为了获得可接受的性能,我不希望读取整个文件。

如何在不对每个文件的全部内容执行全文搜索的情况下找到所有开头包含任何给定关键字集的文件?

标签: windowspowershellgrep

解决方案


我能够通过手动迭代所有文件来解决我的问题,只读取几个字节(我需要分析的文件是 ASCII,如果它们是 unicode,这可能不适用于所有情况),并查看它是否匹配

$keywords = @("FOO", "BAR", "BAZ")

Get-ChildItem -Path "*.*" -Recurse | Foreach-Object {
    # only read 500 bytes. needs byte encoding as -TotalCount otherwise gets interpreted as number of lines
    $bytes = Get-Content $_.FullName -Encoding byte -TotalCount 500
    # turn content back into string
    $content = [char[]]($bytes) -join ''

    $keywords | Foreach-Object {
        if ($content -match $_) {
            Write-Output "$($_): $($_.FullName)";
        }
    }
}

推荐阅读