如何使用 grep 显示没有两个特定字符串之一的行?

如何使用 grep 显示没有两个特定字符串之一的行?

对于大型日志文件,如何显示没有“成功”或未以“确定”终止的那些行?

答案1

删除包含以下内容的行任何一个字符串,特别是 grep:

  • 根据乔丹的评论,在一个命令中:

    grep -Ev 'success|ok$'
    

    或者:

    grep -ve success -e 'ok$'
    

    或者:

    grep -v 'success
    ok$'
    
  • 在两个命令中:

    grep -v success file | grep -v 'ok$'

例子:

$ cat file
success something else
success ok
just something else

$ grep -Ev 'success|ok$'
just something else
$ grep -v success file | grep -v 'ok$'
just something else

删除包含以下内容的行两个都字符串,特别是 grep:

grep -v 'success.*ok$' file

例子:

$ cat file
success something else
success ok
just something else

$ grep -v 'success.*ok$' file
success something else
just something else

答案2

我会尝试 awk

awk '/success/ { next ; } /ok$/ { next ; } { print ;}' file

在哪里

  • /success/ { next ; }查找单词success并跳行
  • /ok$/ { next ; }查找小写字母ok并跳行
  • { print ;}隐式 else : 打印行

根据建议

短 awk (感谢 Stéphane Chazelas )

awk '!/success/ && !/ok$/'

这基本上不是(成功)也不是(行尾确定)

打高尔夫球 awk (感谢 cas )

awk '! /success|ok$/'

它重用正则表达式,并否定它

答案3

添加到上面的 grep -Ev 命令:您可以使用egrep -v 'success|ok$' filename

答案4

由于提到了 awk,另一种选择是 sed:

sed '/success/d;/ok$/d' file
sed -e '/success/d' -e '/ok$/d' file

或(较新的 sed 和未来的 POSIX)感谢 Stéphane Chazelas

sed -E '/success|ok$/d' file

相关内容