1

我正在研究一个正则表达式,以从具有固定宽度间距的大型机日志行中提取确切的字符(...正则表达式不是我的强项,顺便说一句)。

我想提取 Status 字段的字段值,它是包含下面示例事件中显示的 、 和 值SUCCESSFUL AUDITLOGON COMPLETE固定长度字段。FINAL FAILED AUDIT

这个固定长度字段有很多值,所以我不能像我试图做的那样真正提取文字字符串值。

相反,我想提取从事件位置 54 开始的任何字符,并且长度正好是 18 chars

任何有关正则表达式或方法等的帮助或想法,将不胜感激。

528 LOGON   39690  SECURITY LAPTOP    8481 USER AB11 SUCCESSFUL AUDIT  BBB908AFB 06/20/12 09:11:43PM    
528 LOGON   39692  SECURITY LAPTOP    8495 USER AB11 LOGON COMPLETE    BBB908AFB 06/20/12 09:12:12PM    
528 LOGOFF  39699  SECURITY DESKTOP   4476 USER ABEQ FINAL FAILED AUDITAADAFCC01 06/20/12 09:55:49PM   
4

2 回答 2

1

考虑以下通用正则表达式的 powershell 示例。

.{53}(.{18})

例子

    $Matches = @()
    $String = '528 LOGON   39690  SECURITY LAPTOP    8481 USER AB11 SUCCESSFUL AUDIT  BBB908AFB 06/20/12 09:11:43PM    
528 LOGON   39692  SECURITY LAPTOP    8495 USER AB11 LOGON COMPLETE    BBB908AFB 06/20/12 09:12:12PM    
528 LOGOFF  39699  SECURITY DESKTOP   4476 USER ABEQ FINAL FAILED AUDITAADAFCC01 06/20/12 09:55:49PM
528 LOGON   39690  SECURITY LAPTOP    8481 USER AB11 REMEBER TO VOTE   BBB908AFB 06/20/12 09:11:43PM'
    Write-Host start with 
    write-host $String
    Write-Host
    Write-Host found
    ([regex]'.{53}(.{18})').matches($String) | foreach {
        write-host "key at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'"
        } # next match

产量

start with
528 LOGON   39690  SECURITY LAPTOP    8481 USER AB11 SUCCESSFUL AUDIT  BBB908AFB 06/20/12 09:11:43PM    
528 LOGON   39692  SECURITY LAPTOP    8495 USER AB11 LOGON COMPLETE    BBB908AFB 06/20/12 09:12:12PM    
528 LOGOFF  39699  SECURITY DESKTOP   4476 USER ABEQ FINAL FAILED AUDITAADAFCC01 06/20/12 09:55:49PM
528 LOGON   39690  SECURITY LAPTOP    8481 USER AB11 REMEBER TO VOTE   BBB908AFB 06/20/12 09:11:43PM

found
key at 53 = 'SUCCESSFUL AUDIT  '
key at 159 = 'LOGON COMPLETE    '
key at 265 = 'FINAL FAILED AUDIT'
key at 367 = 'REMEBER TO VOTE   '

概括

  • .{53}跳过前 53 个字符(注意字符串中的第一个位置为零)
  • (.{18}) 查找并返回 18 个字符宽的字段
于 2013-05-01T22:21:12.347 回答
0
  1. 正则表达式是这个简单问题的复杂解决方案。
  2. 由于输入格式和所需输出的偏移量是固定的,只需逐行读取输入,并进行一些小的字符串处理。
  3. 如果仍然需要正则表达式,这是一个起点(尽管在您自己的输入数字 54 和 18 中与您想要的答案不匹配,所以我尝试使用 47 和 16 代替,您可以根据需要进行修改):

    (?<=[a-zA-Z0-9 ]{47})([a-zA-Z0-9 ]{16})

    http://regexr.com?328dm

于 2012-09-24T05:58:23.267 回答