Grep多个模式否定匹配


14

因此,我有一堆使用标准日志格式的Apache日志。我想获取并非来自网络搜寻器的所有日志行。

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

Googlebot
msnbot-media
YandexBot
bingbot

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

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


当我在系统上尝试此操作时,grep -v -f具有所需的行为,仅返回不匹配任何模式的行。这是(GNU grep)2.14.56-1e3d。您正在使用什么grep?
wingedsubmariner 2013年

我在跑步GNU grep 2.6.3
Zoredache

4
我进行了更多测试,发现如果patterns文件中有一个空行,它将与每一行匹配,从而导致-v不返回任何行。但是,这不是-F的问题,并且-F可能会加快grep的执行速度-可能值得您尝试一下。
wingedsubmariner 2013年

空行尾!嗯...这似乎是问题所在。如果需要,应将其添加为答案。
Zoredache

Answers:


8

如果patterns文件中有一个空行,它将匹配每一行,从而不会导致返回任何行-v。这是因为行被解释为正则表达式,并且空的正则表达式将始终匹配。

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


1
GNU fgrep忽略尾随空字符串是在2.19中已修复的错误(commit 2d3832e1ff772dc1a374bfad5dcc1338350cc48b,因此您不应该依赖它。
StéphaneChazelas 2015年

13

你可以试试:

grep -vE 'Googlebot|msnbot-media|YandexBot|bingbot' yourlogfile

2
欢迎使用Unix和Linux。OP列出了大约30个他想忽略的字符串,而他作为示例展示的四个字符串平均每个长度为10个字符,因此您的命令可能超过300个字符。这可能很难维护(甚至难以阅读)。您可以将答案修改为由OP的字符串列表驱动吗?…………………………………………………………PS您是否注意到已经找到答案了?— OP已经学会了如何使用他的原始方法来工作。
G-Man说'Resstate

2
为什么对我的回答给予负面评价?:/
奥西乌斯2015年

3
好答案。有正则表达式或-vE选项很有帮助。
Kirt Carson

3
这是大多数人可能试图解决的问题的答案。
Perfi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.