【问题标题】:.txt Log File Data Extraction Output to CSV with REGEX.txt 使用 REGEX 将日志文件数据提取输出到 CSV
【发布时间】:2018-07-12 17:28:51
【问题描述】:

我之前问过这个问题,LotPings 提出了一个完美的结果。当与用户交谈时,这与我一开始只得到了一半的信息有关!

现在确切知道需要什么,我将再次解释该场景......

注意事项:

  • 终端始终是 A 后跟 3 位数字,即 A123

  • 用户 ID 位于日志文件的顶部,仅出现一次,始终以 89 开头,长度为六位数。该行将始终以 SELECTED FOR OPERATOR 89XXXX 开头

  • 文件中有两个日期模式(一个是搜索日期,另一个是 DOB),每个都需要提取到单独的列中。并非所有记录都有 DOB,有些记录只有年份。

  • 询问者并不总是以“C”开头,而是需要整行。

  • 搜索结果总是有'查询',然后提取。

这是日志文件

L 交易记录从 01/05/2018 0001 到 31/05/2018 2359 选择运营商 891234 启动终端用户查询终端IP ==================================================== ==================================================== ===================== 18 年 1 月 5 日 1603 A555 CART87565 46573 RBCO NPC 服务 GW/10/0043 搜索查询记录编号:S48456/06P 章节代码 = 显示记录:S48853/98D 要求打印:单条记录 ==================================================== ==================================================== ===================== 18 年 3 月 5 日 1107 A555 CERT16574 BTD/54/1786 16475 REF 查询 DHF ID : 58/94710W 章节代码 = 显示记录:S585988/84H ==================================================== ==================================================== ===================== 24/05/18 1015 A555 CERT15473 19625 CBRS DDS 服务 NM/18/0199 图片查询名称:TREVOR SMITH CHAPTER CODE = 出生日期 : / /1957 ==================================================== ==================================================== ===================== 24/05/18 1025 A555 CERT15473 15325 CBRS DDS 服务 NM/12/0999 REF 查询 DDS ID : 04/102578R 章节代码 = ==================================================== ==================================================== =====================

这是一个日志文件的示例,需要提取什么以及在什么标题下。

到这样的 CSV

PowerShell Script LotPings 完美运行,我只需要从第一行提取用户 ID,以说明并非所有具有 DOB 的记录并且存在不止一种类型的查询,即 Ref Enquiry、Search Enquiry、Image查询。

$FileIn   = '.\SO_51209341_data.txt'
$TodayCsv = '.\SO_51209341_data.csv'

$RE1 = [RegEx]'(?m)(?<Date>\d{2}\/\d{2}\/\d{2}) (?<Time>\d{4}) +(?<Terminal>A\d{3}) +(?<User>C[A-Z0-9]+) +(?<Enquirer>.*)$'
$RE2 = [RegEx]'\s+SEARCH REF\s+NAME : (?<Enquiry>.+?) (PAGE|CHAPTER) CODE ='
$RE3 = [RegEx]'\s+DATE OF BIRTH : (?<DOB>[0-9 /]+?/\d{4})'

$Sections = (Get-Content $FileIn -Raw) -split "={30,}`r?`n" -ne ''

$Csv = ForEach($Section in $Sections){
    $Row= @{} | Select-Object Date, Time, Terminal, User, Enquirer, Enquiry, DOB
    $Cnt = 0
    if ($Section -match $RE1) {
        ++$Cnt
        $Row.Date     = $Matches.Date
        $Row.Time     = $Matches.Time
        $Row.Terminal = $Matches.Terminal
        $Row.User     = $Matches.User
        $Row.Enquirer = $Matches.Enquirer.Trim()
    }
    if ($Section -match $RE2) {
        ++$Cnt
        $Row.Enquiry  = $Matches.Enquiry
    }
    if ($Section -match $RE3){
        ++$Cnt
        $Row.DOB      = $Matches.DOB
    }
    if ($Cnt -eq 3) {$Row}
}

$csv | Format-Table
$csv | Export-Csv $Todaycsv -NoTypeInformation

【问题讨论】:

  • Select-String '(?&lt;=FOR OPERATOR\s+)\d+' | Select-Object -Expand Mateches | Select-Object -Expand Value

标签: powershell csv logging extraction


【解决方案1】:

有了如此精确的数据,第一个答案可能是:

## Q:\Test\2018\07\12\SO_51311417.ps1
$FileIn   = '.\SO_51311417_data.txt'
$TodayCsv = '.\SO_51311417_data.csv'

$RE0 = [RegEx]'SELECTED FOR OPERATOR\s+(?<UserID>\d{6})'
$RE1 = [RegEx]'(?m)(?<Date>\d{2}\/\d{2}\/\d{2}) (?<Time>\d{4}) +(?<Terminal>A\d{3}) +(?<Enquirer>.*)$'
$RE2 = [RegEx]'\s+(SEARCH|REF|IMAGE) ENQUIRY\s+(?<SearchResult>.+?)\s+(PAGE|CHAPTER) CODE'
$RE3 = [RegEx]'\s+DATE OF BIRTH : (?<DOB>[0-9 /]+?/\d{4})'

$Sections = (Get-Content $FileIn -Raw) -split "={30,}`r?`n" -ne ''
$UserID = "n/a"
$Csv = ForEach($Section in $Sections){
    If ($Section -match $RE0){
        $UserID = $Matches.UserID
    } Else {
        $Row= @{} | Select-Object Date,Time,Terminal,UserID,Enquirer,SearchResult,DOB
        $Cnt = 0
        If ($Section -match $RE1){
            $Row.Date     = $Matches.Date
            $Row.Time     = $Matches.Time
            $Row.Terminal = $Matches.Terminal
            $Row.Enquirer = $Matches.Enquirer.Trim()
            $Row.UserID   = $UserID
        }
        If ($Section -match $RE2){
            $Row.SearchResult  = $Matches.SearchResult
        }
        If ($Section -match $RE3){
            $Row.DOB      = $Matches.DOB
        }
        $Row
    }
}

$csv | Format-Table
$csv | Export-Csv $Todaycsv -NoTypeInformation

样本输出

Date     Time Terminal UserID Enquirer                                           SearchResult           DOB
----     ---- -------- ------ --------                                           ------------           ---
01/05/18 1603 A555     891234 CART87565       46573 RBCO NPC SERVICES GW/10/0043 RECORD NO : S48456/06P
03/05/18 1107 A555     891234 CERT16574       BTD/54/1786 16475                  DHF ID : 58/94710W
24/05/18 1015 A555     891234 CERT15473       19625 CBRS DDS SERVICES NM/18/0199 NAME : TREVOR SMITH      /  /1957
24/05/18 1025 A555     891234 CERT15473       15325 CBRS DDS SERVICES NM/12/0999 DDS ID : 04/102578R

【讨论】:

  • 哇,这太完美了!您能否就我在哪里可以了解有关 PowerShell 脚本的更多信息给我任何建议?文档和/或课程。我可以看到我被要求做更多这些,并想自己尝试很多!
  • 40 年的 IT 背景确实有所帮助,但老实说,我对 powershell 了解最多的是 Stack Overflow 帮助其他人。脚本中的逻辑主要基于带有交替和命名捕获组的正则表达式 - 阅读Regular-Expressions.info 并尝试regex101.com
  • 谢谢,我非常努力地让它自己工作,但是因为我是 PowerShell 的真正初学者,所以我并不真正了解某些脚本是如何工作的,所以我将从头开始学习并希望我能在此基础上再接再厉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
  • 2020-11-30
相关资源
最近更新 更多