获取包含巨大文本文件中的字符串的所有行 - 尽可能快?

时间:2014-01-23 14:09:13

标签: powershell

在Powershell中,如何在一个巨大的文本文件(大约200000行/ 30 MBytes)中读取并尽可能快地获取包含特定字符串的最后一行(或所有行)? 我正在使用:

get-content myfile.txt | select-string -pattern "my_string" -encoding ASCII | select -last 1

但它非常长(约16-18秒)。 我在没有最后一根管道“select -last 1”的情况下进行了测试,但这是同一时间。

以更快的方式来获取巨大文件中特定字符串的最后出现(或所有出现的)?

也许这是所需的时间...... 或者它有可能从最后更快地读取文件,因为我想要最后一次出现? 感谢

5 个答案:

答案 0 :(得分:39)

试试这个:

get-content myfile.txt -ReadCount 1000 |
 foreach { $_ -match "my_string" }

这将一次读取1000个记录的块中的文件,并找到每个块中的匹配项。这样可以提供更好的性能,因为您不会在内存管理上浪费大量的CPU时间,因为管道中一次只有1000行。

答案 1 :(得分:5)

你试过了吗?

gc myfile.txt | % { if($_ -match "my_string") {write-host $_}}

或者,你可以创建一个类似“grep”的函数:

function grep($f,$s) {
    gc $f | % {if($_ -match $s){write-host $_}}
    }

然后你可以发出:grep $myfile.txt $my_string

答案 2 :(得分:2)

您是否尝试过使用[System.IO.File]::ReadAllLines();?这种方法比PowerShell-esque方法更“原始”,因为我们直接插入Microsoft .NET Framework类型。

$Lines = [System.IO.File]::ReadAllLines();
[Regex]::Matches($Lines, 'my_string_pattern');

答案 3 :(得分:2)

$reader = New-Object System.IO.StreamReader("myfile.txt")

$lines = @()

if ($reader -ne $null) {
    while (!$reader.EndOfStream) {
        $line = $reader.ReadLine()
        if ($line.Contains("my_string")) {
            $lines += $line
        }
    }
}

$lines | Select-Object -Last 1

答案 4 :(得分:0)

我想提取包含失败的行,并将此行写入新文件,为此我将添加完整的命令

get-content log.txt -ReadCount 1000 |
>>  foreach { $_ -match "failed" } | Out-File C:\failes.txt