我有一个大文件 (250 Gb),我需要搜索一个字符串,一旦找到它,我需要从该行到文件末尾复制所有内容。 示例文件:
Bird
Lion
Tiger
Jaguar
Frog
Snake
结果是:
Jaguar
Frog
Snake
我是 PowerShell 的新手,并尝试了以下操作,但只能找到字符串 Jaguar 并打印出来,我还需要以下几行。
Get-Content -Path "C:\Dump\test1.txt" |
Select-String 'Jaguar' |
Set-Content -Path "C:\Dump\test2.txt"
答案 0 :(得分:5)
既然您说您的文件非常大(并且可能生成的文件也很大),我想我会使用 switch
和 StreamWriter
$writer = [System.IO.StreamWriter]::new('C:\Dump\test2.txt')
$foundMarker = $false
switch -Regex -File 'C:\Dump\test1.txt' {
'\bJaguar\b' { $foundMarker = $true; $writer.WriteLine($_) }
default { if ($foundMarker) { $writer.WriteLine($_) } }
}
# clean up
$writer.Flush()
$writer.Dispose()
围绕关键字 \b
的 Jaguar
使其成为“全字”搜索。
附言如果您需要区分大小写匹配关键字,请将开关 CaseSensitive
添加到开关:switch -Regex -CaseSensitive -File 'C:\Dump\test1.txt' {...}
答案 1 :(得分:0)
我创建了一个简单的不稳定函数,您可以将其用于大文件:
function Get-Content-Since-Equals-To-File(){
param (
[string] $Path,
[string] $LineText,
[string] $PathNewFile
)
$writer = [System.IO.StreamWriter]::new($PathNewFile)
$continue=0
foreach($line in [System.IO.File]::ReadLines($Path))
{
if($line.Equals($LineText)){$continue=1}
if( $continue -eq 1){
#Add-Content -Path $PathNewFile -Value $line #According to mklement0 using Add-Content is really slow
$writer.WriteLine($line);
}
}
$writer.Dispose();
}
然后您可以通过传递文件路径来调用该函数,因为您想要获取文件和新文件路径:
Get-Content-Since-Equals-To-File -Path ./1.txt "Jaguar" -PathNewFile './newFile.txt'
上述结果生成了一个具有所需结果的文件(注意我使用的是相对路径作为示例,在您的日常工作中您应该使用绝对路径并考虑工作目录 aka cwd):
Get-Content ./newFile.txt
Jaguar
Frog
Snake
此函数基于 Read file line by line in PowerShell ,因为它逐行读取,您可以在大文件中使用它。
如果不需要匹配,可以使用其他条件来适配函数。
感谢@mkelement0 对 Add-Content 的改进,我使用 StreamWriter 更新了代码。