我目前正在筛选大量不熟悉的日志来寻找一些问题。我查看的第一个文件是 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+N
和Ctrl+ R。)
因此,例如,&dns
将仅显示与模式匹配的行dns
,并&!dns
过滤(排除)这些行,仅显示与模式不匹配的行。
/
在命令的描述中注意到
这
pattern
是一个正则表达式,由系统提供的正则表达式库识别。
所以
ð[01]
将显示包含eth0
或的行eth1
&arp.*eth0
将显示包含arp
以下内容的行eth0
&arp|dns
将显示包含arp
或的行dns
并且!
可以反转以上任何一个。因此,您要在问题中使用的示例命令是:
&!event text|something else|the other thing|foo|bar
还可以使用和 进行搜索(和/转到下一个/上一个)。/pattern
?pattern
n
N
答案2
建立在猎户座的回答, 这less(1)
手册页描述
/pattern
在文件中向前搜索氮-第 行包含
pattern
. 氮 †默认为 1。这pattern
是一个正则表达式,由系统提供的正则表达式库识别。搜索从显示的第二行开始(但请参阅-a
和-j
选项,这会改变这一点)。
pattern
如果在;的开头输入某些字符,则这些字符是特殊的。他们修改搜索类型而不是成为以下内容的一部分pattern
:
^N
或者!
搜索与 不匹配的行
pattern
。^E
或者*
搜索多个文件。也就是说,如果搜索到达当前文件的末尾而没有找到匹配项,则在命令行列表中的下一个文件中继续搜索。
^F
或者@
从命令行列表中第一个文件的第一行开始搜索,无论屏幕上当前显示的内容或
-a
或-j
选项的设置如何。^K
突出显示与当前屏幕上的 匹配的任何文本
pattern
,但不要移动到第一个匹配项(保留当前位置)。^R
不要解释正则表达式元字符;也就是做一个简单的文字比较。
____________
†命令前面可以有一个十进制数字,称为氮在描述中……
(当然^N
and^E
等代表
Ctrl+N和Ctrl+E等)
事实证明, 并且合作得很好。例如,命令&pattern
/pattern
&!arp|dns
Enter/
Ctrl+Kfail|fatal|fault|sd[a-z][0-9]
Enter
以任一顺序键入,都将隐藏(排除)所有包含arp
或dns
(如grep -v
)的行,然后在其余行中突出显示所有出现的fail
、fatal
、fault
或任何看起来像 SCSI 设备名称 ( sd[a-z][0-9]
) 的内容。请注意,包含arp
ordns
以及 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 运算)。但在大多数情况下,这不应该是一个问题,根据我的经验,事情进展顺利。
试一试。当我不太确定自己在寻找什么并且上下文并不重要时,我发现它在浏览事物时非常有用。