查看不带特定字符串的行的文件


12

搜索类似tail或的程序,这样less我就可以查看没有包含特定字符串的行的日志。例如,查看没有UFW([UFW BLOCK])输入行的系统日志。


尽管使用此功能为您的确切问题描述提供解决方案并不容易,但您可能想知道,这less提供了在正则表达式模式之后过滤显示行的可能性。您可以&通过在模式后面键入来使用此功能,也可以通过&单独键入来还原它。
亚伦

Answers:


13

模式匹配反转选项-vgrep是真正有用的是:

grep -v 'UFW BLOCK' /var/log/syslog

这将显示所有不包含的行UFW BLOCK。由于grep默认情况下使用基本正则表达式,方括号的包含将使其搜索“ UFW BLOCK”的任何单个字符(包括空格)。您可能最终将没有输出。如果您需要确保字符串周围有括号,请转义它们\[UFW BLOCK\],或使用-F选项grep仅包含固定的字符串(感谢ZannaSteeldriver的建议):

grep -Fv '[UFW BLOCK]' /var/log/syslog

您可以通过将输出通过管道传送到寻呼机来简化查看过程less

grep -v 'UFW BLOCK' /var/log/syslog | less

或者将输出重定向到主目录中的文件以供以后查看:

grep -v 'UFW BLOCK' /var/log/syslog > ~/filtered_syslog

2
您也可以使用fgrep等效于的命令grep -F
图兰斯·科尔多瓦

2
@TulainsCórdovagrep的人说:“不建议将直接调用作为egrep或fgrep调用,但是可以允许依赖它们的历史应用程序未经修改地运行”。我不知道他们是否会对这种弃用采取行动,但我猜想使用这些命令并不是最佳做法
Aaron

5

您也可以使用sedd命令从流中删除带有模式的行:

sed '/\[UFW BLOCK\]/d' /var/log/syslog

我们[]通常会逃脱,因为它们表示字符类,意思是“在此匹配任何内容”


5

您可以使用任何具有编辑功能的工具。您已经使用grep和获得了解决方案sed,这里还有其他一些选择。所有这些都可以轻松地通过管道传输到lessmore其他任何管道上。

  1. 佩尔

    perl -ne 'print unless /\[UFW BLOCK\]/' /var/log/syslog
    

    因为这是Perl,所以TIMTOWDI!

    perl -pe '$_="" if /\[UFW BLOCK\]/' /var/log/syslog
    perl -ne '/\[UFW BLOCK\]/ || print' /var/log/syslog
    perl -ne 'print if !/\[UFW BLOCK\]/' /var/log/syslog
    perl -ne '!/\[UFW BLOCK\]/ && print' /var/log/syslog
    perl -ne '/\[UFW BLOCK\]/ ? "" : print' /var/log/syslog
    
  2. awk

    awk '!/\[UFW BLOCK\]/' file
    

2

您也可以使用awk

awk '!/PATTERN/' log

当我拥有多个“模式”并且不想使用两个grep类似的模式时,我会使用它:

... | grep -v foo | grep -v bar

语法是:

awk '!/PATTERN/ && !/PATTERN2/' log

“当我有一个以上的“模式”并且不想使用两个grep时,我就使用它grep -Ev "foo|bar"
αғsнιη

您也可以-e用来定义多个模式。grep -v -e 'foo' -e 'bar'
Arronical '17

@AFSHIN(不知道我的评论如何删除),我的意思是合乎逻辑的而不是;)
Ravexina

1

通过less命令&选项,可以过滤出仅显示所需的匹配模式,如下所示,

& /PATTERN/

在您的情况下,如果您希望过滤器行UFW BLOCK不显示在输出中,则可以使用&!以下方法:

&! /UFW BLOCK/
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.