1

在 Windows 主机上,我正在查看日志文件以查找特定故障。

我要查找的字符串是 SERV_,但我不想要 SERV_SUCCESS 或 SERV_FAIL。例如,SERV_REPLACE 是我想要捕获的几个代码之一。

grep SERV *.log -d -n | grep -v SERV_SUCCESS *.log -d -n

不起作用(返回所有行 - 一切都匹配),但它也不会抱怨语法。

我所有的主题搜索都提供了适用于 Linux 系统的解决方案。

4

3 回答 3

1

如果你使用 Powershell,你可以用它Select-String来实现你正在寻找的东西。这是它的参考

Select-String cmdlet 在输入字符串和文件中搜索文本和文本模式。您可以使用类似于 UNIX 中的 grep 或 Windows 中的 findstr.exe 的 Select-String。

用法

Select-String
      [-Pattern] <string[]>
      [-Path] <string[]>
      [-SimpleMatch]
      [-CaseSensitive]
      [-Quiet][-List]
      [-Include <string[]>]
      [-Exclude <string[]>]
      [-NotMatch]
      [-AllMatches]
      [-Encoding <Encoding>][-Context <int[]>]
      [<CommonParameters>]

例子

Get-Command | Out-File -FilePath .\Command.txt
Select-String -Path .\Command.txt -Pattern 'Get', 'Set'  -NotMatch
于 2019-07-25T13:05:00.840 回答
1

如果你使用ugrep,你可以像这样使用“负面模式”

ugrep SERV_ -e '(?^SERV_SUCCESS)' -e '(?^SERV_FAIL)' *.log

这是ugrep引入否定模式作为表单的正则表达式标记(?^...)以忽略不需要的匹配的原因之一。因为否定模式是正则表达式语法的一部分,所以您也可以更紧凑地编写:

ugrep 'SERV_|(?^SERV_(SUCCESS|FAIL))' *.log

Github 包中包含一个 Windows 可执行文件。可执行文件是直接从源代码构建的,并且是良性的。

于 2019-07-25T15:08:21.603 回答
0

遵循简洁的语法看起来会递归

  • 对于所有.log文件
  • 选择包含的行SERV_
  • 从结果中省略包含SERV_FAIL或的行SERV_SUCCESS

gci *.log -rec -file | sls 'SERV_' | sls -NotMatch 'SERV_(FAIL|SUCCESS)'

一个更易读的版本是

Get-ChildItem *.log -Recursive -File | 
    Select-String 'SERV_' | 
    Select-String -NotMatch 'SERV_(FAIL|SUCCESS)' 
于 2019-07-25T14:18:18.593 回答