【问题标题】:grep exclude multiple stringsgrep 排除多个字符串
【发布时间】:2013-04-19 05:22:33
【问题描述】:

我正在尝试使用 tail -f 查看日志文件,并希望排除包含以下字符串的所有行:

"Nopaging the limit is"`  and `"keyword to remove is"

我可以像这样排除一个字符串:

tail -f admin.log|grep -v "Nopaging the limit is"

但是如何排除包含string1string2 的行。

【问题讨论】:

    标签: linux ubuntu


    【解决方案1】:

    用grep过滤掉多行的两个例子:

    把这个放到filename.txt:

    abc
    def
    ghi
    jkl
    

    grep 命令使用 -E 选项在字符串中的标记之间使用管道:

    grep -Ev 'def|jkl' filename.txt
    

    打印:

    abc
    ghi
    

    使用 -v 选项的命令,在由括号括起来的标记之间带有管道:

    egrep -v '(def|jkl)' filename.txt
    

    打印:

    abc
    ghi
    

    【讨论】:

    • 我很惊讶没有人谈论 grep -v -e def -e jkl 恕我直言更清楚的方法......
    • 或者更好:grep -Fv -e def -e jkl 更快!
    • 使用 -F 标志,您可以使用换行符作为分隔符而不是管道。这样可以更轻松地将命令输出用作过滤器,例如:grep -vF $(pgrep myprocess)
    【解决方案2】:
    grep -Fv -e 'Nopaging the limit is' -e 'keyword to remove is'
    

    -F 通过文字字符串匹配(而不是正则表达式)

    -v 反转匹配

    -e 允许多种搜索模式(所有文字和反转)

    【讨论】:

    • 这是正确的答案:唯一避免多个grep -v 实例和正则表达式的人为要求(让多个字符串在单独的参数中明确指定)的唯一方法。试想一下,在脚本中以编程方式为可能包含任何内容的字符串构建该正则表达式……
    • 实际上这些都不是正确的答案,因为当不传递任何关键字来排除时,它将排除所有内容而不是什么。
    【解决方案3】:

    另一个选项是创建一个排除列表,当您有很长的排除列表时,这特别有用。

    vi /root/scripts/exclude_list.txt
    

    现在添加您要排除的内容

    Nopaging the limit is
    keyword to remove is
    

    现在使用 grep 从文件日志文件中删除行并查看未排除的信息。

    grep -v -f /root/scripts/exclude_list.txt /var/log/admin.log
    

    【讨论】:

    • 我没有意识到您可以将-v-f 一起使用(或者后者甚至存在)。
    • 非常非常有用!
    • 请注意,您不必为排除列表创建临时文件。在 bash 中,您可以使用进程替换。如果排除列表有点动态,并且您必须在每次使用之前生成它只能使用一次,这会很方便:grep -v -f <(gen_exclusions.sh) /var/log/admin.log
    【解决方案4】:
    egrep -v "Nopaging the limit is|keyword to remove is"
    

    【讨论】:

      【解决方案5】:
      tail -f admin.log|grep -v -E '(Nopaging the limit is|keyword to remove is)'
      

      【讨论】:

        【解决方案6】:

        您可以像这样使用常规 grep:

        tail -f admin.log | grep -v "Nopaging the limit is\|keyword to remove is"

        【讨论】:

        • 这个答案在 MacOSX 上对我有用。逃离管道是关键
        【解决方案7】:

        grep 可以被链接。例如:

        tail -f admin.log | grep -v "Nopaging the limit is" | grep -v "keyword to remove is"
        

        【讨论】:

        • 这里的问题是,您必须依次运行 N 个进程,而不是过滤掉的进程,每个进程都会过滤掉一些东西。它可能会显着减慢速度。
        【解决方案8】:

        如果你想使用正则表达式:

        grep -Ev -e "^1" -e '^lt' -e 'John'

        【讨论】:

        • 这应该是公认的答案
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多