grep里面少吗?


58

我目前正在筛选许多不熟悉的日志,以查找一些问题。我看的第一个文件是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

Answers:


91

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


1
快到了!在中less,使用'&!<1stpattern>'允许我“隐藏”带有模式的行,但是一次仅适用于一个模式,因此,如果我找到第二个模式并应用'&!<2ndpattern>',与第一个模式匹配并被隐藏的线现在可见。非常接近!
2015年

@forquare:您可以使用向上和向下箭头键访问命令历史记录。因此,按&!,然后按箭头键。
下午

@forquare:我刚刚发现历史记录已保存,因此您的旧模式将在下次运行时可用less;不过,我不知道重新启动后是否保留该文件。
下午

1
@orion是我遗失的最后一点-如何将模式连接在一起。我虽然之前曾经尝试过管道符号,但失败了,但是现在我再次尝试了!因此:&!<pattern1> | <pattern2> | <pattern3>将删除具有pattern1或pattern2或pattern3的行
将于2015年

1
我想到了。Homebrew dupes具有最新版本。我只是不得不踢bash,因为它没有抓住正确的文件(即使告诉我它正在抓住/ user / local / bin / less)。
自旋锁

7

基于orion的答案less(1)手册页描述了

/pattern

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

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

    ^N 要么 !

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

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

   (当然,^N^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])。请注意,将不会显示包含arpdns以及fail其他危险字词的行。


2

在过去的几个月中,我有点被迷住了fzf

在您的情况下,只要不需要上下文(即,不需要 grep的-A-B-C,并且较少的情况&也具有相同的限制),则fzf是一个非常强大的工具。

这是一个愚蠢的例子:

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

如果运行该命令并使用诸如此类的输入aa | bb dd | ee !gg !hh,您将很快看到正在发生的事情。

Fzf关于|运算符的文档很少,但是我最大的猜测是它仅适用于紧接前后的术语,这实际上意味着OR优先于AND(这是隐式的;默认情况下,所有术语均为AND-ed) 。但是在大多数情况下,这不应该成为问题,根据我的经验,一切都可以解决。

试一试。当我不确定自己要查找的内容以及上下文无关紧要时,当浏览内容时,我发现它非常有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.