在PowerShell中使用Select-String排除搜索模式

25

我正在使用select string在文件中搜索错误。是否可以像grep一样排除搜索模式?例如:

grep ERR* | grep -v "ERR-10"

select-string -path logerror.txt -pattern "ERR"

日志错误.txt

OK
ERR-10
OK
OK
ERR-20
OK
OK
ERR-10
ERR-00

我想获取所有的ERR行,但不包括ERR-00和ERR-10


每行只有一个 ERR 项吗? - Jaqueline Vanek
我每行没有错误。 - Pedro Sales
3
@Hitesh,-Exclude 仅适用于 -Path,而不是模式。 - Pedro Sales
(Get-Content logerror.txt | Select-String -Pattern "ERR") -NotMatch "ERR-10" -NotMatch "ERR-00"。您可以详细说明这种简单的方法,赞赏-NotMatch运算符接受正则表达式 - JosefZ
@JosefZ - 谢谢您的回答。如果我只有一个-NotMatch运算符,它就可以工作...但如果我有多个,它就不能工作了。 - Pedro Sales
显示剩余3条评论
2个回答

33

我使用"-NotMatch"参数来实现这个功能

PS C:\>Get-Content .\some.txt
1
2
3
4
5
PS C:\>Get-Content .\some.txt | Select-String -Pattern "3" -NotMatch    
1
2
4
5

针对您的情况,答案如下:

Get-Content .\logerror.txt | Select-String -Pattern "ERR*" | Select-String -Pattern "ERR-[01]0" -NotMatch

7
我想你可以在这里使用Where-Object
Write-Output @"
OK
ERR-10
OK
OK
ERR-20
OK
OK
ERR-10
ERR-00
"@ > "C:\temp\log.txt"

# Option 1.
Get-Content "C:\temp\log.txt" | Where-Object { $_ -Match "ERR*"} | Where-Object { $_ -NotMatch "ERR-[01]0"}

# Option 2.
Get-Content "C:\temp\log.txt" | Where-Object { $_ -Match "ERR*" -and $_ -NotMatch "ERR-[01]0"}

谢谢您的回答。我明白您想做什么,但这只是一个例子。如果我的错误代码越来越复杂(就像现在一样),这种方法行不通:例如:ERR-201、ERR-422;ERR-240。我只需要一种过滤错误的方法,因为有些是真正的错误,而其他的只是信息。 - Pedro Sales
@PedroSales,那你就修改正则表达式。我展示的代码相当于grep -v "ERR-[01]0",也就是说,你可以使用正则表达式来从输出中排除行。我猜你已经知道如何模拟没有-v参数的grep了。 - Gebb
使用grep命令,我只需将另一个错误代码与grep -v命令一起使用。 - Pedro Sales
没问题,我会修改我的答案以适应你的grep组合。 - Gebb
非常感谢您的帮助。我已经困扰了几天了。 - Pedro Sales

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接