如何从 grep 中排除一些匹配项?

how to exclude some of the matches from grep?

我正在使用 grep 从一个非常大的文件中打印出匹配的行 从中我得到了数百个匹配项,其中一些不感兴趣我想排除那些不感兴趣的匹配项

grep "WARNING" | grep -v "WARNING_HANDLING_THREAD" path # 我试过了

当我 grep 警告文件时,我得到

0-00:00:33.392 (2127:127:250:02 = 21.278532 Fri Feb 1 10:17:22 2019) <3:0x000a>:[89]:[enter]: cest_handleFreeReq.c:116: [WARNING]: cest_handleFreeReq: sent from DECA ->UCS

0-00:00:38.263 (2189:022:166:06 = 21.891510 Fri Feb 1 10:17:28 2019) <3:0x000a>:[89]:[enter]: cest_handleConfigReq.c:176: [WARNING]: cest_handleConfigReq.c: GroupConfig NOT present.

0-00:00:38.263 (2189:022:167:03 = 21.891510 Fri Feb 1 10:17:28 2019) <3:0x000a>:[89]:[enter]: cest_handleConfigReq.c:194: [WARNING]: cest_handleConfigReq: physicalConfig NOT present.

60 0x6d77 0 0x504ea | 2 18 | 0 0 | 4 12 | 647 | 14685 0 0.0 0 500 500 | 0 | 0 | 38 | ETH_DRV_WARNING_HANDLING_thread 60 0 | 0 0 | 0 0 0 | 0 0 0 0 0 0 ! N/A N/A N/A N/A N/A N/A |ETH_DRV_WARNING_HANDLING_thread

WARNING: List of threads violating the heap & stack limit

我想排除不感兴趣的最后几行

0-00:00:33.392 (2127:127:250:02 = 21.278532 Fri Feb 1 10:17:22 2019) <3:0x000a>:[89]:[enter]: cest_handleFreeReq.c:116: [WARNING]: cest_handleFreeReq: sent from DECA ->UCS

0-00:00:38.263 (2189:022:166:06 = 21.891510 Fri Feb 1 10:17:28 2019) <3:0x000a>:[89]:[enter]: cest_handleConfigReq.c:176: [WARNING]: cest_handleConfigReq.c: GroupConfig NOT present.

0-00:00:38.263 (2189:022:167:03 = 21.891510 Fri Feb 1 10:17:28 2019) <3:0x000a>:[89]:[enter]: cest_handleConfigReq.c:194: [WARNING]: cest_handleConfigReq: physicalConfig NOT present.

有没有办法使用 grep find 或任何其他工具来做到这一点?

谢谢

请注意,子字符串 thread 在数据中为小写,但在表达式中为大写。

改为使用

grep -F 'WARNING' logfile | grep -F -v 'WARNING_HANDLING_thread'

-F 使 grep 使用字符串比较而不是正则表达式匹配(这与您当前的问题确实无关,只是一种方式表明我们知道要匹配的模式类型)。

另一种选择是使第二个 grep-i:

进行不区分大小写的匹配
grep -F 'WARNING' logfile | grep -Fi -v 'WARNING_HANDLING_THREAD'

虽然在这种情况下,我可能会匹配 [WARNING] 标签:

grep -F '[WARNING]:' logfile

请注意,这里我们需要 -F 以便grep 将模式解释为字符串而不是匹配任何单个字符的正则表达式在 WARNIG 集合中,后跟 :.