【问题标题】:Log Parsing via Powershell - print all array elements after nth element通过 Powershell 进行日志解析 - 在第 n 个元素之后打印所有数组元素
【发布时间】:2020-01-03 00:01:44
【问题描述】:

我正在解析一个日志文件,其中前 7 个元素以空格分隔,然后是一条日志消息或句子。我知道足以在 PS 中四处走动,而且我每天都在学习更多,所以我不确定这是做到这一点的最佳方式,如果我没有利用一种更有效的方式,这将是第二天性,我深表歉意给你。我正在使用 -split(' ')[n] 逐行提取日志文件的每个字段。我能够很好地提取第一部分,因为它们是用空格分隔的,但我不确定如何将其余元素放到行尾。

$logFile=Get-Content $logFilePath
$dateStamp=$logfile -split(' ')[0]
$timeStamp=$logfile -split(' ')[1]
$requestID=$logfile -split(' ')[3]
$binaryID=$logfile -split(' ')[4]
$logID=$logfile -split(' ')[5]
$action=$logfile -split(' ')[6]

$logMessage=$logfile -split(' ')[?]

这不是我可以导入的 CSV。我更熟悉 bash 中的字符串操作,因此我能够成功地替换前 7 个元素中的空格,最后用 "," :

#!/bin/bash

inputFile="/cygdrive/c/Temp/logfile.log"
outputFile="/cygdrive/c/Temp/test_log.csv"

echo "\"DATE\",\"TIME\",\"HYPEN\",\"REQUESTID\",\"BINARY\",\"PROC_NUMBER\",\"MESSAGE\"" > $outputFile

while read -a line
do
        arrLength=$(echo ${#line[@]})
        echo \"${line[0]}\",\"${line[1]}\",\"${line[2]}\",\"${line[3]}\",\"${line[4]}\",\"${line[5]}\",\"${line[@]:6:$arrLength}\"
done < $inputFile >> $outputFile

您能否帮助打印从位置 n 到末尾的数组元素,或者在 PS 中适当地替换空格以便我有一个可以导入的 CSV?只是试图避免在 bash 中转换它,然后在 PS 中导入它的两步过程,但我仍在研究。我确实找到了这篇文章Parsing Text file and placing contents into an Array Powershell 用于导入文件,假设它是空格分隔的,并且适用于前 7 个元素,但不确定之后的所有内容。

当然,我欢迎任何其他 PS 解决方案,例如我通过谷歌搜索看到的 [something]::SOMETHING 东西之一,它可能会更无缝地完成所有这些工作。

【问题讨论】:

    标签: string powershell parsing logging


    【解决方案1】:

    您可以指定拆分字符串的最大子字符串数,如下所示:

    $splittedRow = $logfile.split(' ',8)
    
    $dateStamp=$splittedRow[0]
    $timeStamp=$splittedRow[1]
    $requestID=$splittedRow[3]
    $binaryID=$splittedRow[4]
    $logID=$splittedRow[5]
    $action=$spltttedRow[6]
    
    $logMessage=$splittedRow[7]
    

    【讨论】:

    • 目前这对我最有效。在解析时,我将每个变量的结果存储到 New-Object System.Collections.ArrayList 中,然后将结果导出到 CSV。非常感谢!
    • 嘿@deskFan。很高兴我的回答对您有所帮助!您可以用绿色复选标记将其标记为最佳答案吗?谢谢!
    【解决方案2】:

    作为 Viktor Be 答案的补充:

    $data = "111 22222 333 4444444 5 6 77 888888 9999999 0" #this is the content of file below for testing purposes
    #$data = get-content -path C:\temp\mytest.txt
    
    foreach ($line in $data){
        $splitted = $line.split(' ',8)
        $line_output= ""
        for ($i = 0;$i -lt 7;$i++){
            $line_output += "$($splitted[$i]);"
        }
        $line_output += $splitted[7]
        $line_output | out-file "C:\temp\MyCsvThatPowershellCanRead.csv" -append
    }
    

    【讨论】:

      【解决方案3】:

      您应该能够遍历日志文件中的每一行,并以您正在做的方式获取您需要的信息。但是,很容易获取消息字段,其中可能包含 n 使用正则表达式的日志消息中的空格数。

      以下正则表达式应该适合您。假设$line 是您所在的当前行:

      $line -match '(?<=(\S+\s+){6}).*'
      $logMessage = $matches[0]
      

      这个表达式的工作方式是它在出现 6 次非空白字符后跟空白字符之后查找 .*(这意味着任何字符 0 次或更多次)。此表达式中的 .* 应与您的日志消息匹配。

      【讨论】:

        猜你喜欢
        • 2023-01-30
        • 1970-01-01
        • 1970-01-01
        • 2018-07-11
        • 1970-01-01
        • 2013-05-06
        • 1970-01-01
        • 1970-01-01
        • 2021-03-20
        相关资源
        最近更新 更多