【问题标题】:How to Parse a logfile in powershell and write out desired output如何在 powershell 中解析日志文件并写出所需的输出
【发布时间】:2013-07-19 17:07:11
【问题描述】:

我有一个脚本,它使用 robocopy 传输文件并将日志写入文件“Logfile.txt”之后,我进一步解析文件“LogFile.txt”并浏览必要的数据并将其写入其他名为的文本文件“LogFile_Parsed.Txt”。我的问题在这里结束。最初我计算行数并解析每一行;我的目标是当我到达与单词相匹配的行时 skipped ,如果行号是 x;我会将 (x-5) 到 (x+1) 行附加到新的日志文件“LogFile_Parsed.Txt”中。我在说的那一行在下面;

               Total    Copied   Skipped  Mismatch    FAILED    Extras
Dirs :         1         1         0         0         0         0

现在,我被困在哪里了;我只想将这些行附加到已解析的日志字段中,当跳过或失败的行下方的数字大于 0 时;即喜欢跟随;

               Total    Copied   Skipped  Mismatch    FAILED    Extras
Dirs :         1         1         1         0         1         0

怎么做?我提到的上述两行在整个日志文件中是一致的。我怎样才能知道跳过或失败的数字的确切位置并阅读它?请告诉我您的宝贵建议。

【问题讨论】:

    标签: powershell powershell-2.0 tokenize robocopy logparser


    【解决方案1】:

    如果我理解正确,您想在“已跳过”下方的列中找到任何带有“已跳过”一词的行,然后是带有数字 1 的行,并将这两行和前五行附加到一个新文件中?

    1. 将 LogFile.txt 读入数组
    2. 遍历数组以搜索带有“已跳过”的行
    3. 只要找到一个,就使用正则表达式匹配来查看下一行(即数组的下一个元素)的相应位置是否为 1
    4. 使用数组切片获取当前元素之前的 5 到 1 之后的元素,并将其附加到新文件中

    如果所有匹配行的格式都与您的示例相同:

    $logfile = gc '<path>\Logfile.txt'
    for ($i = 0; $i -lt $logfile.count; $i++) {
        if ($logfile[$i] -match 'Skipped') {
            if ($logfile[$i + 1] -match '(?<=Dirs :(\s+[0-9]+){2}\s+)1') {
                $logfile[($i - 5)..($i + 1)] | Out-File -Append '<path>\Logfile_Parsed.txt'
            }
        }
    }
    

    如果列的数量和顺序可能不同,您需要使用捕获组来查找“已跳过”的序号位置,并检查下一行的相应位置是否有 1。这有点复杂,所以如果这足够了,我将不再赘述。

    【讨论】:

    • 谢谢,它正在工作;我还发现这个poshcode.org/2164 使用 $tokens = [System.Management.Automation.PsParser]::Tokenize( $scriptContent, [ref] $null) | Where-Object { $ignoreTokens -notcontains $_.Type } $tokens = $tokens | Sort-Object StartLine,StartColumn 但是您的解决方案看起来更好,因为它使用正则表达式。
    猜你喜欢
    • 2022-07-12
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2016-04-20
    • 1970-01-01
    相关资源
    最近更新 更多