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

Joh*_*Gr. 13 command-line less

搜索类似tailless这样的程序,它可以让我查看没有包含特定字符串的行的日志。例如,在没有 UFW ( [UFW BLOCK]) 条目行的情况下查看我的系统日志。

Arr*_*cal 13

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

grep -v 'UFW BLOCK' /var/log/syslog
Run Code Online (Sandbox Code Playgroud)

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

grep -Fv '[UFW BLOCK]' /var/log/syslog
Run Code Online (Sandbox Code Playgroud)

您可以通过将输出管道传输到寻呼机来更轻松地查看,例如less

grep -v 'UFW BLOCK' /var/log/syslog | less
Run Code Online (Sandbox Code Playgroud)

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

grep -v 'UFW BLOCK' /var/log/syslog > ~/filtered_syslog
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用等效于 `grep -F` 的 `fgrep` 命令。 (2认同)
  • @TulainsCórdova grep 的人说“不推荐直接调用 egrep 或 fgrep,但提供它是为了允许依赖它们的历史应用程序未经修改地运行”。我不知道他们是否会根据这种弃用行为采取行动,但我想使用这些命令不是最佳实践 (2认同)

Zan*_*nna 5

您还可以使用sed'sd命令从流中删除具有模式的行:

sed '/\[UFW BLOCK\]/d' /var/log/syslog
Run Code Online (Sandbox Code Playgroud)

我们[]通常转义它们表示一个字符类,意思是“匹配这里的任何内容”


ter*_*don 5

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

  1. 珀尔

    perl -ne 'print unless /\[UFW BLOCK\]/' /var/log/syslog
    
    Run Code Online (Sandbox Code Playgroud)

    由于这是 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
    
    Run Code Online (Sandbox Code Playgroud)
  2. awk

    awk '!/\[UFW BLOCK\]/' file
    
    Run Code Online (Sandbox Code Playgroud)


αғs*_*нιη 5

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

& /PATTERN/
Run Code Online (Sandbox Code Playgroud)

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

&! /UFW BLOCK/
Run Code Online (Sandbox Code Playgroud)