因此,我被要求编写一个脚本,该脚本将大型 IIS 日志作为输入并处理它以进行一些日志记录。 IIS 日志包含大量(对我来说)无用的信息,其中一些 blob 包含用户访问某些内容的时间。这些格式为域\身份。
我有捕获组:
(DOMAIN\\[a-z]\d+)
这匹配域名和身份(其格式以单个字母开头,后跟一些数字(不是固定长度)。示例:test 123456 或 test 213。
我希望有人比我更擅长 Java REGEX 可以帮助弄清楚如何捕获除该捕获组之外的所有内容。 我想运行一个查询来删除所有其他内容。
因为我有那个捕获组,所以我总是可以将匹配写入一个新文件并实现相同的输出...但是我使用的工具(Apache Nifi)有可以轻松替换内容的工具,但我必须做一个更复杂一点(例如,使用实际的脚本)根据匹配来生成新的输出。
我知道可能有无数其他方法可以更简单地做我想做的事情...但是因为我徒劳地浪费了 20 分钟在 regex101 上玩,我希望有人能启发我。 日志中的示例行如下所示:
testingtesting123 test\t12345 512.1235.212.321 Apples+Test/9.9.9+(Product:+129+10.492.29) - 400 testing testing123
使用您的捕获组捕获所有日志条目怎么样? 和结尾的新行。然后将其替换为捕获 组和新线路。
然后添加一个替代项来匹配完整的日志条目,只是将其删除 无需在替换中替换它。
注释的正则表达式,Java 风格,带有
m
和 x
标志:
^ # Begin of log entry (assuming it's a begin of line).
(?: # Two variants:
# A) A line to keep where we extract the domain\user
# Anything, ungreedy, to avoid "eating" the domain\user.
.*?
# Begin of word, domain\user, end of word.
\b(?<domainUser>DOMAIN\\[a-z]\d+)\b
# Anything and the captured new line, to use in the replacement.
.*(?<newLine>\R|\z)
|
# B) A log entry without the interesting domain\user.
.*\R
)
替换为
${domainUser}${newLine}
。