输出搜索字符串后每行的内容

时间:2018-02-01 16:54:23

标签: powershell

我有一个调试日志,它会根据预设的错误消息吐出某些数字。 例如

  

08:29:25.178 [DEBUG]错误查找ID 2834

     

08:29:25.179 [DEBUG]错误查找ID 2834

我想要这样做的主要原因是能够输出此ID的唯一实例(在上面的例子中只有一个2834)。否则这是不可能的,因为行中的时间戳使其唯一。因此,我只需要在结尾处输出id(在本例中为2834)。

我目前有以下脚本可以使用,但我想知道是否没有更有效/更优雅的方法来完成所有这些。

    $tempfile='tempfile.txt'
    $tempfile2='tempfile2.txt'
    $tempfile3='tempfile3.txt'
    $finalfile='missingIDs.txt'

    get-content 20180131.log -ReadCount 1000 |
    foreach { $_ -match " Error lookup ID" } > $tempfile

    get-content $tempfile | % { $_.Split(' ')[-1] } >$tempfile2
    gc $tempfile2 | sort | get-unique > $tempfile3

    gc $tempfile3| get-unique > $finalfile

2 个答案:

答案 0 :(得分:0)

删除中间文本文件,改为使用管道。

    ()                  |             ()
    qp                  |             []
    ||                  |             /\
--------------------------------------------------

这使得整个过程更加高效,因为没有磁盘写入/读取。

答案 1 :(得分:0)

为了清晰起见重述问题:

根据输入行,找到"错误查找ID"后跟一串数字ID。返回输入中找到的所有唯一ID

$testInput = @(
"08:29:25.177 [INFO] system started 5342"
"08:29:25.177 [DEBUG] Error lookup ID 2834"
"08:29:25.178 [TRACE] entered something"
"08:29:25.179 [DEBUG] Error lookup ID 2834"
"08:29:25.179 [DEBUG] Error lookup ID 2836"
)

$testInput | % { if ($_ -match ".*Error lookup ID (\d+)"){$Matches.1} } | Select-Object -Unique