2

使用“高级”IIS 登录工具处理 IIS 日志的输入提取器问题,以收集比基本日志提供的更多信息。它在许多字段中添加了双引号和空格,我们正在尝试使用提取器来纠正这个问题。这是示例消息的开头:

2016-02-08 16:46:35.957 "SITE" "SOURCE" XX.XX.XX.XX GET /blah/etc/etc/file.ext - 80 - "XX.XX.XX.XX" "HTTP/1.1" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; yie11; rv:11.0) like Gecko"

我们已经编写了一个提取器来删除所有添加的引号,然后再运行它通过所有其他提取器来填充字段等,但是我们希望+在我们这样做之前替换引号之间的所有空格以匹配旧的日志记录样式.

任何人都可以为我们指出正确的方向吗?到目前为止,我最接近的是" "在 SITE 和 SOURCE 之间捕获并使用类似"([\s]*)". 结果:

2016-02-08 16:46:35.957 "SITE+SOURCE" XX.XX.XX.XX GET /blah/etc/etc/file.ext - 80 - "XX.XX.XX.XX+HTTP/1.1+Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; yie11; rv:11.0) like Gecko"

我似乎不能只寻找引号之间的空格。

任何帮助将不胜感激。谢谢。


进一步澄清。字符串的这一部分:

"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; yie11; rv:11.0) like Gecko"

应该:

"Mozilla/5.0+(Windows+NT+6.1;+WOW64;+Trident/7.0;+yie11;+rv:11.0)+like+Gecko"

其他所有内容都应与字符串引用部分内的唯一空格相同。

这甚至可以使用正则表达式吗?

4

1 回答 1

0

恐怕正则表达式不是最好的工具。您基本上必须“计算”引号以确定空格是否在引号内。

你可以尝试这样的事情(Python):

text = '2016-02-08 16:46:35.957 "SITE" "SOURCE" XX.XX.XX.XX GET /blah/etc/etc/file.ext - 80 - "XX.XX.XX.XX" "HTTP/1.1" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; yie11; rv:11.0) like Gecko"'
escaped = ""
count = 0
for c in text:
    if c == '"':
        count += 1
    if c == " " and count % 2 == 1:
        escaped += "+"
    else:
        escaped += c

之后escaped是这样的:

2016-02-08 16:46:35.957 "SITE" "SOURCE" XX.XX.XX.XX GET /blah/etc/etc/file.ext - 80 - "XX.XX.XX.XX" "HTTP/1.1" "Mozilla/5.0+(Windows+NT+6.1;+WOW64;+Trident/7.0;+yie11;+rv:11.0)+like+Gecko"
于 2016-02-09T15:59:07.410 回答