grep 里面少吗?

grep 里面少吗?

我目前正在筛选大量不熟悉的日志来寻找一些问题。我查看的第一个文件是 Events.log,并且至少获得了三个页面,less其中似乎在不同时间显示相同的事件 - 该事件看起来相当良性。我想过滤掉这个事件,目前我退出less并做类似的事情

grep -v "event text" Events.log | less

现在,这带来了许多其他常见的、无趣的事件,我也想过滤掉它们。有什么办法我可以grep -v 里面less?而不是必须做

egrep -v "event text|something else|the other thing|foo|bar" Events.log | less

在我看来,在查看任何类型的日志文件时,它都是一个有用的功能——如果less不是这个工具,是否还有另一个具有我所寻求的品质的工具?只是一个less内置grep.

答案1

less具有非常强大的模式匹配功能。来自手册页:

&pattern

    pattern仅显示与; 匹配的行不匹配的行pattern 不会显示。如果pattern为空(如果您&紧接着键入ENTER),则所有过滤都会关闭,并且会显示所有行。当过滤生效时,提示符开头会显示一个 & 符号,以提醒您文件中的某些行可能被隐藏。

    某些字符是特殊的,如/命令中所示:

    ^N或者!

      仅显示与 不匹配的行pattern
    ^R
      不要解释正则表达式元字符;也就是做一个简单的文字比较。

    ____________
    如果在 开头输入某些字符,则这些字符是特殊的pattern;他们修改搜索类型而不是成为pattern.

   (当然^N和分别^R代表Ctrl+NCtrl+ R。) 

因此,例如,&dns将仅显示与模式匹配的行dns,并&!dns过滤(排除)这些行,仅显示与模式不匹配的行。

/在命令的描述中注意到

    pattern是一个正则表达式,由系统提供的正则表达式库识别。

所以

  • &eth[01]  将显示包含eth0或的行eth1
  • &arp.*eth0将显示包含arp以下内容的行eth0
  • &arp|dns  将显示包含arp或的行dns

并且!可以反转以上任何一个。因此,您要在问题中使用的示例命令是:

&!event text|something else|the other thing|foo|bar

还可以使用和 进行搜索(和/转到下一个/上一个)。/pattern?patternnN

答案2

建立在猎户座的回答, 这less(1)手册页描述

/pattern

    在文件中向前搜索-第 行包含pattern.  默认为 1。这pattern是一个正则表达式,由系统提供的正则表达式库识别。搜索从显示的第二行开始(但请参阅-a-j选项,这会改变这一点)。

    pattern如果在;的开头输入某些字符,则这些字符是特殊的。他们修改搜索类型而不是成为以下内容的一部分pattern

    ^N或者!

      搜索与 不匹配的行pattern
    ^E或者*
      搜索多个文件。也就是说,如果搜索到达当前文件的末尾而没有找到匹配项,则在命令行列表中的下一个文件中继续搜索。
    ^F或者@
      从命令行列表中第一个文件的第一行开始搜索,无论屏幕上当前显示的内容或-a-j选项的设置如何。
    ^K
      突出显示与当前屏幕上的 匹配的任何文本pattern,但不要移动到第一个匹配项(保留当前位置)。
    ^R
      不要解释正则表达式元字符;也就是做一个简单的文字比较。

    ____________
    命令前面可以有一个十进制数字,称为在描述中……

   (当然^Nand^E等代表 Ctrl+NCtrl+E等) 

事实证明, 并且合作得很好。例如,命令&pattern/pattern

  • &!arp|dnsEnter
  • /Ctrl+Kfail|fatal|fault|sd[a-z][0-9]Enter

以任一顺序键入,都将隐藏(排除)所有包含arpdns(如grep -v)的行,然后在其余行中突出显示所有出现的failfatalfault或任何看起来像 SCSI 设备名称 ( sd[a-z][0-9]) 的内容。请注意,包含arpordns以及 Alsofail或任何其他危险词的行将不是被显示。

答案3

在过去的几个月里,我已经有点迷恋了fzf

就你而言,只要不需要上下文(即不需要相当于 grep 的-A, -B, 或,顺便说一句,less也有同样的限制),那么 fzf 是一个非常强大的工具。-C&

这是一个愚蠢的例子:

printf "%s\n" {aa,bb,cc}{dd,ee,ff}{gg,hh,ii} | fzf

如果你运行它,并使用aa | bb dd | ee !gg !hh诸如此类的输入,你很快就会看到发生了什么。

Fzf 关于|运算符的文档很少,但我最好的猜测是它仅适用于紧邻之前和之后的术语,这意味着实际上 OR 优先于 AND(即隐含的;默认情况下,所有术语都经过 AND 运算)。但在大多数情况下,这不应该是一个问题,根据我的经验,事情进展顺利。

试一试。当我不太确定自己在寻找什么并且上下文并不重要时,我发现它在浏览事物时非常有用。

相关内容