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

时间:2019-10-04 00:12:53

标签: powershell text-files line-numbers

我有一个大的日志文件(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脚本吗?

2 个答案:

答案 0 :(得分:2)

一种适用于处理输入文件的简单且内存高效方法是将Get-Content与{{1} }:

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

  • 因此,第3 行是Get-Content进行的第一个处理和输出,而
    Select-Object则是然后立即停止处理,这样就不需要读取文件的其余部分。


一种 更快的方法如果直到所需行号的文件部分足够小完全适合记忆体

-First 1
  • (Get-Content -TotalCount 3 -ReadCount -3 user.log)[-1] 告诉-TotalCount 3总共最多读取3行。

    • Get-Content还告诉-ReadCount 3一次将所有三行 读入一个数组,并将其作为单个对象通过管道发送给它-而不是逐行 -这不是必要,而是加快命令的速度。
  • Get-Content然后从结果数组(第3行)中提取 last 元素。


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

[-1]

也就是说,(Get-Content user.log)[2] # add -ReadCount 0 to speed things up 读取 all 行,Get-Content将这些行收集到内存中的数组中,(...)访问数组的 3rd元素< / em>,即第三行。

加快此解决方案的一种简单方法是添加[2],这使-ReadCount 0本身发出所有输入行的数组作为单个输出对象,而不是一张一张地发射线,然后让Get-Content将它们收集在一个阵列中。

答案 1 :(得分: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
    }
}