Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PowerShell - Remove all lines of text file until a certain string is found

Tags:

powershell

I currently have an output log file that's a bit of a mess and grows quickly. It's the debug output for a large script that permissions mailboxes. I basically just want to delete every line in the file until it finds the first iteration of the date 7days ago.

So far, I can return all lines containing that date

$content = Get-Content $file
$lastweek = "{0:M/d/yyyy}" -f (get-date).AddDays(-7)

$content | Where-Object { $_.Contains("$lastweek") }

But I can not figure out a function to just wipe everything until that is found for the first time.

I have tried a -replace:

$content -replace ".*$lastweek", " " | Set-Content $file -Force

But that only seems to replace from the beginning of each line that contains the specified string.

like image 658
Justin Avatar asked Nov 22 '25 06:11

Justin


2 Answers

If you're running V4, you can use the array .Where() method, with the 'SkipUntil' option:

$content.Where({ $_ -like "*$lastweek*" },'SkipUntil')
like image 107
mjolinor Avatar answered Nov 23 '25 19:11

mjolinor


If you want to only keep the entries containing your specified search string from that log file, you can do something to the effect of:

$content = Get-Content $file | Where-Object {$_ -notcontains "$lastweek"} 
$content | Set-Content $file -force

Replace -notcontains "$lastweek" with -notlike "*$lastweek*" if needed for better matching.

like image 40
bentek Avatar answered Nov 23 '25 20:11

bentek