【问题标题】:How to NOT include certain no. of patterns in the output?如何不包括某些不。输出中的模式?
【发布时间】:2018-01-17 09:54:02
【问题描述】:

我有一个命令 -

some command | egrep -i "($query_value)"

返回类似 -

的行
> 2018-01-12 23:17:05.097 Info: Deleted 6 MB at 1129 MB/sec
> /Meters/00002c97 2018-01-12 23:17:05.104 Info: Deleted 6 MB at 864
> MB/sec /Meters/00002c99 2018-01-12 23:26:00.751 Info: Saving
> /Meters/00002c9a 2018-01-12 23:26:01.235 Info: Saved 6 MB at 12 MB/sec
> to /Meters/00002c9a 2018-01-12 23:26:01.268 Info: Merging 12 MB from
> /Meters/00002c9b and /Meters/00002c9a to /Meters/00002c9d,
> timestamp=15158205609400820 2018-01-12 23:26:04.248 Info: Deleted 9 MB
> at 3898 MB/sec /Meters/00002c9b 2018-01-12 23:26:04.250 Info: Deleted
> 6 MB at 2973 MB/sec /Meters/00002c9a 2018-01-12 23:34:01.420 Info:
> Saving /Meters/00002c9c 2018-01-12 23:34:02.192 Info: Saved 6 MB in 1
> sec at 8 MB/sec to /Meters/00002c9c 2018-01-12 23:34:02.248 Info:
> Merging 44 MB from /Meters/00002c98, /Meters/00002c9d, and
> /Meters/00002c9c to /Meters/00002c9f, timestamp=15158210419400730
> 2018-01-12 23:34:07.173 Info: Deleted 35 MB at 9431 MB/sec
> /Meters/00002c98 2018-01-12 23:34:07.175 Info: Deleted 12 MB at 6633
> MB/sec /Meters/00002c9d 2018-01-12 23:34:07.177 Info: Deleted 6 MB at
> 2869 MB/sec /Meters/00002c9c 2018-01-12 23:42:00.842 Info: Saving
> /Meters/00002c9e 2018-01-12 23:42:01.323 Info: Saved 6 MB at 12 MB/sec
> to /Meters/00002c9e 2018-01-12 23:51:00.951 Info: Saving
> /Meters/00002ca0 2018-01-12 23:51:01.680 Info: Saved 6 MB in 1 sec at
> 8 MB/sec to /Meters/00002ca0 2018-01-12 23:51:01.684 Info: Merging 10
> MB from /Meters/00002c9e and /Meters/00002ca0 to /Meters/00002ca2,
> timestamp=15158220605927080 2018-01-12 23:51:05.083 Info: Deleted 6 MB
> at 2127 MB/sec /Meters/00002c9e 2018-01-12 23:51:05.085 Info: Deleted
> 6 MB at 2933 MB/sec /Meters/00002ca0 2018-01-12 23:58:01.110 Info:
> Saving /Meters/00002ca1 2018-01-12 23:58:02.011 Info: Saved 6 MB in 1
> sec at 7 MB/sec to /Meters/00002ca1 2018-01-12 23:58:02.017 Info:
> Merging 12 MB from /Meters/00002ca2 and /Meters/00002ca1 to
> /Meters/00002ca4, timestamp=15158224804450160 2018-01-12 23:58:05.096
> Info: Deleted 9 MB at 419 MB/sec /Meters/00002ca2 2018-01-12
> 23:58:05.105 Info: Deleted 6 MB at 668 MB/sec /Meters/00002ca1

但我想进一步排除包含merging*mb*from|merged*mb*from 等模式的行。我不想要这样的线条 -

Merging 12 MB from or Merged 12 MB from .  

我尝试使用 grep 的 -v 选项,但它似乎不理解 区分大小写 和 'AND'、'OR' 操作。

【问题讨论】:

    标签: bash shell grep pattern-matching


    【解决方案1】:

    关注sed 可能对您有所帮助。

    sed -n '/Merging.*MB.*from/d;/Merged.*MB.*from/d;p'   Input_file
    

    sed -n '/[mM]erging.*[mM][bB].*from/d;/Merged.*MB.*from/d;p'  Input_file
    

    编辑:这里也为上面的代码添加解释。

    sed -n '                 ##-n will STOP printing by default for any line of Input_file till we print it explicitly.
    /Merging.*MB.*from/d;    ##Looking for string Merging.*MB.*from and using d will skip it and will NOT print it.
    /Merged.*MB.*from/d;     ##Looking for string Merged.*MB.*from and using d will skip it and will not print it.
    p                        ##mentioning p will print the lines apart from lines which have above mentioned string in them
    ' Input_file             ##Mentioning Input_file name here.
    

    【讨论】:

    • 你能解释一下这会做什么吗?
    • @rishabhv66,请检查我编辑的解释和代码,如有任何疑问,请告诉我。
    • @rishabhv66,在 OR 之后检查我的代码,它也处理区分大小写的 mb|MB 等。
    • 好的,我要用这个替换“某些命令”-sed -n '/2018-01-12 03:0[3-9]/,/2018-01-12 23:59 /p' $log_file.这将过滤日志文件并提取给定时间范围内的行。首先,你能解释一下这是如何工作的。我在这里也使用了“p”,所以从技术上讲,它不应该打印过滤后的行,但它会做相反的事情。如果您可以将 2 个 sed 结合起来,那就太好了。这样我就不必使用 piple '|'符号。
    • @risabhv66,cmets 不适合提问问题,请为新问题打开新线程,以便我们大家学习。
    【解决方案2】:

    试试grep-E(扩展正则表达式)-i(忽略大小写)-v(反转匹配):

    grep -E -i -v 'merg(ing|ed).*mb.*from'
    

    如果你认为“忽略大小写”很慢,那么:

    grep -E -v '[Mm]erg(ing|ed).*[Mm][Bb].*[Ff]rom'
    

    【讨论】:

      猜你喜欢
      • 2019-10-17
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2021-02-04
      • 2013-08-02
      相关资源
      最近更新 更多