如何从文本文件中提取特定行

4
我有一个大的日志文件(user.log),例如:
   2019-10-02 00:03:55.407095
   2019-10-02 00:03:55.410345
   2019-10-02 00:03:55.410765
   2019-10-02 00:03:55.411187
   2019-10-02 00:03:55.411791
   2019-10-02 00:03:55.412657

我该如何从日志文件中提取第3行的内容,例如:

2019-10-02 00:03:55.410765

请问有没有用powershell脚本实现的方法?


Get-Content cmdlet有一个-ReadCount参数。如果将其设置为3,并将其管道传递到ForEach-Object {$Test = $_; break},则可以在$Test中获得文件的前三行。您可以通过$Test[2]获取第三行... [grin] - Lee_Dailey
2个回答

10

一种适用于处理大型输入文件的简单而高效的方法是将Get-ContentSelect-Object结合使用:

Get-Content user.log | Select-Object -Skip 2 -First 1
  • -Skip 2指示Select-Object跳过由Get-Content输出的前两个输入行。

  • 因此,第三行是第一个被处理和输出的 - Select-Object,并且-First 1使它在此之后立即停止处理,以便不必读取文件的其余部分。


更快速的方法如果文件部分直到所需行号足够小而能够整个地放入内存中:

(Get-Content -TotalCount 3 -ReadCount -3 user.log)[-1]
  • -TotalCount 3表示让Get-Content最多读取3行。

    • -ReadCount 3告诉Get-Content将所有3行一次性读入数组,并作为单个对象通过管道发送,而不是逐行发送。这不是必需的,但可以提高命令速度。
  • [-1]从结果数组中提取最后一个元素,即第3行。


如果整个输入文件很小,则以下解决方案是最简单的:

(Get-Content user.log)[2]  # add -ReadCount 0 to speed things up

即,Get-Content 读取 所有 行,(...) 将其收集到内存中的一个数组中,[2] 访问该数组的第 3 个元素,即第三行。

简单加快此解决方案的方法是添加 -ReadCount 0,这使得 Get-Content 将所有输入行作为一个单一的输出对象进行发射,而不是逐行发射并让 (...) 在之后将它们收集到一个数组中。


0
你可以尝试这个方法,并将$target变量更改为您想要提取的任何行:
$content = Get-Content "path to user.log"
$count = 0
$target = 3

foreach ($line in $content) {
    $count += 1
    if ($count -eq $target) {
        $line
        break
    }
}

1
虽然这样做是可行的,但对于读取 大型 文件而言不是一个好方法,因为它要求将 整个文件 一次性读入行数组中;如果你愿意支付这个代价,一个更简单的解决方案是:(Get-Content "path to user.log")[2] - mklement0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接