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

Boo*_*ada 3 powershell line-numbers text-files

我有一个大日志文件 (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
Run Code Online (Sandbox Code Playgroud)

我如何从日志文件中提取第 3 行作为;

2019-10-02 00:03:55.410765

通过使用powershell脚本?

mkl*_*nt0 7

一种适用于处理大型输入文件简单且节省内存的方法是结合Get-Content使用Select-Object

Get-Content user.log | Select-Object -Skip 2 -First 1
Run Code Online (Sandbox Code Playgroud)
  • -Skip 2指示Select-Object跳过由 输出的前 2 行输入行Get-Content

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


一种更快的方法如果文件中达到所需行号的部分足够小适合整个内存

(Get-Content -TotalCount 3 -ReadCount -3 user.log)[-1]
Run Code Online (Sandbox Code Playgroud)
  • -TotalCount 3告诉Get-Content您总共阅读 3 行(最多)。

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


如果输入文件整体较小,以下解决方案最简单

(Get-Content user.log)[2]  # add -ReadCount 0 to speed things up
Run Code Online (Sandbox Code Playgroud)

Get-Content读取所有行,这些行(...)收集在内存中的数组中,并[2]访问数组的第 3 个元素,即第 3 行。

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