使用"高级"处理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"
其他所有内容应保持相同,因为这是字符串引用部分内的唯一空格。
这是否可以使用正则表达式?
答案 0 :(得分: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"