在Powershell中,如何在一个巨大的文本文件(大约200000行/ 30 MBytes)中读取并尽可能快地获取包含特定字符串的最后一行(或所有行)? 我正在使用:
get-content myfile.txt | select-string -pattern "my_string" -encoding ASCII | select -last 1
但它非常长(约16-18秒)。
我在没有最后一根管道“select -last 1
”的情况下进行了测试,但这是同一时间。
以更快的方式来获取巨大文件中特定字符串的最后出现(或所有出现的)?
也许这是所需的时间...... 或者它有可能从最后更快地读取文件,因为我想要最后一次出现? 感谢
答案 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