用特定字符串替换行并使用相同名称保存

时间:2014-01-29 22:42:37

标签: powershell logging

我正在使用创建日志文件的应用程序。由于软件本身的错误,它会产生三个我不感兴趣的错误。每一行都有一个唯一的标识符,所以我不能只更换该行,因为每一行都不同。

我有两个主要问题:我需要使用相同的名称保存它,当它工作时,文件应该可用(如果记录器需要写东西)。

我无法对原始应用进行硬编码,以防止它写入日志的那一部分。

到目前为止我已尝试过:

Get-Content log.log | Where-Object {$_-notmatch 'ERROR1' -And $_-notmatch 'ERROR2' -And $_-notmatch 'ERROR3' } `|Set-Content log_stripped.log

^仅当输出文件具有不同的名称时才有效。

Get-Content error.log | foreach-object { Where-Object {$_-notmatch 'ERROR1' -And $_-notmatch 'ERROR2' -And $_-notmatch 'ERROR3' } } | Set-Content error.log

^这个冻结了我的PS会话。

我也尝试将文件读取到变量:

$logcontent = ${h:error.log}

但我收到了System.OutOfMemoryException。

理想情况下,我需要的是读取日志文件,删除我不想要的所有行,然后用原始名称保存它。

想法? (请记住,使用不需要的数据时,日志文件为+/- 900 MB;使用第一种方法剥离数据时,日志文件为45mb - 但我需要它以原始名称保存文件)

2 个答案:

答案 0 :(得分:1)

当您仍然从中读取文件时,无法将文件保存为相同的名称,这意味着您必须在开始编写之前将整个900MB读取到内存中。不是个好主意。

试试这个:

Remove-Item log_stripped.log

Get-Content log.log -ReadCount 1000 | 
foreach {$_ -notmatch 'ERROR1|ERROR2|ERROR3' | Add-Content log_stripped.log }

Remove-item log.log
Rename-Item log_stripped.log log.log

答案 1 :(得分:1)

我知道您说要保存到相同的文件名,但如果您想要的原因是您希望日志不断更新,那么您可以执行以下操作:

Get-Content -Wait log.log | 
    ? {$_ -notmatch 'ERROR1|ERROR2|ERROR3' } |
    Out-File log_stripped.log

注意Get-Content上的-Wait。

随着log_stripped.log的更新,

log.log会不断更新。