Grep 多模式否定匹配

Zor*_*che 15 grep

所以我有一堆使用标准日志格式的 Apache 日志。我想获取所有不是来自网络爬虫的日志行。

所以可以说我有一个文件robot_patterns,其中包含以下条目

Googlebot
msnbot-media
YandexBot
bingbot
Run Code Online (Sandbox Code Playgroud)

如果我运行该命令,grep -f robot_patterns *.log我将通过与上述模式匹配的机器人获取所有条目。我的实际列表有大约 30 个我希望忽略的机器人和代理条目。

但我想找到所有不是来自 bots的条目。所以我尝试grep -v -f robot_patterns *.log,grep 没有返回任何结果。这不是我所期望或想要的,我也没有找到一种明显的方法来获得我想要的东西。当使用该-v选项与文件中的多个模式结合使用时,grep 仅在匹配每个模式时才返回匹配行。

Ors*_*ius 17

你可以试试:

grep -vE 'Googlebot|msnbot-media|YandexBot|bingbot' yourlogfile
Run Code Online (Sandbox Code Playgroud)

  • 这是大多数人可能试图解决的问题的答案。 (4认同)
  • 很好的答案。有正则表达式或 -vE 选项很有帮助。 (3认同)
  • 欢迎来到 Unix 和 Linux。OP 有一个他想要忽略的大约 30 个字符串的列表,并且他作为示例提供的四个字符串的平均长度为 10 个字符,因此您的命令很可能超过 300 个字符。这可能难以维护(甚至难以阅读)。您可以修改您的答案以由 OP 的字符串列表驱动吗?… … … … … … … … … … … … … … … … … … PS 你有没有发现答案已经找到了?— OP 已经学会了如何让他的原始方法发挥作用。 (2认同)
  • 为什么要负面评价我的回答?:/ (2认同)

win*_*ner 10

如果模式文件中有一个空行,它将匹配每一行,导致没有行返回-v. 这是因为这些行被解释为正则表达式,而空的正则表达式将始终匹配。

-F然而,这不是问题,因为grep忽略带有-F.
-F导致grep将这些行解释为要搜索的简单字符串,grep如果不需要正则表达式,可能会加快速度。