如何在PowerShell中解析日志文件并写出所需的输出

时间:2013-07-19 17:07:11

标签: powershell powershell-v2.0 tokenize robocopy logparser

我有一个脚本,它使用robocopy传输文件并将日志写入文件“Logfile.txt”之后,我进一步解析文件“LogFile.txt”并浏览必要的数据并将其写入其他文本文件中“LogFile_Parsed.Txt”。我的问题已经结束了。最初我计算了没有行并解析了每一行;我的目标是当我到达与跳过的单词匹配的行时,如果行号为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

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

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你想要找到任何带有" Skipped"然后在下面的列中输入数字为1的行" Skipped",并将这两行和前面五行附加到新文件中?

  1. 将LogFile.txt读入数组
  2. 使用" Skipped"
  3. 遍历数组搜索行
  4. 每当找到一个时,使用正则表达式匹配来查看下一行(即数组的下一个元素)是否在相应位置具有1
  5. 使用数组切片将当前元素之前的元素从前面的5个加到1,并将其附加到新文件
  6. 以下内容将起作用如果所有匹配行的格式如下所示:

    $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'
            }
        }
    }
    

    如果列的数量和顺序不同,您需要使用捕获组来查找&#34; Skipped&#34;的序数位置。并检查下一行的相应位置是否有1。这有点复杂,所以如果足够的话我就不会进入。