需要一种在Poweshell中找到字符串后写入文件剩余数据的方法

我有一个大文件 (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"
fxh95 回答:需要一种在Poweshell中找到字符串后写入文件剩余数据的方法

既然您说您的文件非常大(并且可能生成的文件也很大),我想我会使用 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()

围绕关键字 \bJaguar 使其成为“全字”搜索。

附言如果您需要区分大小写匹配关键字,请将开关 CaseSensitive 添加到开关:switch -Regex -CaseSensitive -File 'C:\Dump\test1.txt' {...}

,

我创建了一个简单的不稳定函数,您可以将其用于大文件:

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 更新了代码。

本文链接:https://www.f2er.com/1065.html

大家都在问