2015-04-22 70 views
2

我有一个大的日志文件,我想提取某些类型的行。我创建了一个工作正则表达式来匹配这些行。我现在怎样才能使用这个正则表达式来提取行,而不是别的?我曾尝试正则表达式替换文件的内容和删除不匹配的行

cat .\file | %{ 
    if($_ -match "..."){ 
     $_ -replace "...", '...' 
    } 
    else{ 

     $_ -replace ".*", "" 
    } 
} 

几乎工作,但那些不感兴趣的行仍然为空行(指感兴趣的线相隔很远VERY)。

回答

3

最好的方法是完全删除else子句。如果你这样做,那么ForEach-Object块的迭代中不会返回任何对象。

cat .\file | %{ 
    if($_ -match "..."){ 
     $_ -replace "...", '...' 
    } 
} 
+0

每行没有正则表达式运行一次的目标是什么?如果我添加“s”标志,我认为这不会有帮助?无论哪种方式,我喜欢不修改正则表达式的解决方案 –

+0

是的,其实你是对的。即将编辑。 – briantist

+0

这次我真的测试过它! – briantist

1

只要追加到briantist's answer你甚至不需要循环结构。 -match-replace将作为数组运算符。取消对ifForEach-Object的需求。

(Get-Content .\file) -match "..." -replace "...","..." 

Get-Content是别名cat

+0

非常好,+1! @David Grinberg,Powershell有很多这样的事情,他们真的派上用场。请注意,它们中的一些是在Powershell 3中添加的(例如在包含Thing属性的对象数组上使用'.Thing',以返回一组东西),所以还要注意您正在编写哪个版本。 – briantist

相关问题