【问题标题】:Extracting user agent from logs [closed]从日志中提取用户代理 [关闭]
【发布时间】:2014-07-11 10:03:57
【问题描述】:

我有大型日志文件,其中我得到一个包含用户代理的字段。现在该字段的位置可能因日志而异,我正在尝试按原样提取完整的用户代理字符串。 到目前为止,我尝试过的正则表达式选项不适用于我在这些日志中获得的所有用户代理。他们似乎为他们中的大多数人工作。

以下是我在日志中获取的一些示例用户代理

"field1" "field2" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.65 Safari/535.11"

"field1" "Sundance(Compatible; Windows; U; en-US;) 版本/0.9.0.38" "field2" "field3"

"yacybot (i386 Linux 2.6.24-24-generic; java 1.6.0_07; Europe/en)http://yacy.net/bot.html" "field1" "field2"

“field1”“field2”“Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7m”

我使用的正则表达式(不适用于所有人)如下

([^/\s]*)(/([^\s]*))?(\s*\[[a-zA-Z][a-zA-Z]\])?\s*(\((([^()]|(\([^()]*\)))*)\))?\s*

原始日志是用引号括起来的空格分隔字段(类似于 squid 日志),因此我可以确定每个日志行中用户代理字符串的开头和结尾。但是每个日志文件中字段的位置不同。

如果我能在改进这个正则表达式模式方面得到一些帮助,那将是最好的。我需要的是正则表达式能够匹配我列出的所有上述用户代理字符串。

任何帮助将不胜感激。

编辑

我想要实现的是我需要从不同的日志文件中提取包含用户代理字符串的字段。日志文件包含一系列以空格分隔并用引号括起来的字段。

【问题讨论】:

  • @jonrsharpe 我从来没有要求你成为一个正则表达式写作服务或图书馆推荐的提供者。我说我写了一个需要更多改进的正则表达式。不,没有任何相关问题有助于我发布自己的问题。
  • “如果有人可以将我引导到任何第三方库”...此外,提供比 “不适用于所有他们”(你期待什么,你得到了什么?)
  • 我期待我共享的正则表达式能够捕获所有用户代理。但是有一些例外情况,这个正则表达式似乎失败了。我已经在帖子中分享了例外情况。
  • 所有字段作为字符串:field1、field2 或 field3 与用户代理字符串有什么区别?用户代理字符串是唯一包含空格的吗?这将是一个真正的特征。
  • "only the user agent string contains blanks" 但这并没有多大帮助,因为它并没有消除用户代理不包含空格的可能性。如果所有用户代理都包含空白并且没有其他字段包含空白,那么它就像查找所有 "[^\s]*"|"(.*)" 匹配项并仅保留具有捕获组的匹配项一样简单:debuggex.com/r/mEHs1VRgGrJETyKI

标签: java python regex


【解决方案1】:

回答这个问题的关键在于识别所有用户代理字符串之间的共性,这些字符串不能出现在任何其他字段中。问题是说起来容易做起来难,特别是因为它的格式只有约定——而不是硬性规定。但是确实存在真实用户代理字符串的列表,例如herehere

以下示例 - 选择您喜欢的选项或混合搭配:

  1. 寻找至少一个空格 - 引号中的用户代理(最简单但显然不适用于第一个用户代理字符串,即"Mosaic/0.9"

    "[^"]* [^"]*"

  2. 查找至少一个版本号(用小数点分隔的两位数字 - 仅在保证不在任何其他字段中的情况下) - 第一个捕获组中的用户代理:

    "([^"]*\d\.\d[^"]*)"

  3. 寻找更复杂的东西(如果以上都不起作用,你有一个有限的已知用户代理列表并且搜索文本不能在任何其他字段中,那么可能是你最好的选择) - 使用前瞻的未引用用户代理:

    [^"]*(mozilla|opera|ipad|applewebkit|khtml|7b405|bot|sundance|lynx|etc|etc)[^"]*(?=")

    Debuggex Demo

【讨论】:

  • 不,恐怕用户代理可以进入任何位置。我在帖子中解释说,字段的位置可能会有所不同。为演示 +1
  • 好的,抱歉 - 会再看一遍。建议更新您的帖子以包含用户代理后有字段的示例。
  • 谢谢 - 现在更新了我的答案。
  • 感谢史蒂夫的帮助。
  • 没有问题 Saif。不确定我是否理解对此的反对意见,个人认为这是一个有趣的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 2018-09-08
  • 2021-11-09
  • 1970-01-01
  • 2015-01-09
  • 2021-12-05
相关资源
最近更新 更多