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

Powershell 如何从文本文件中提取特定行,powershell,text-files,line-numbers,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 通

我得到了一个大的日志文件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脚本?

您可以尝试此操作,并将$target变量更改为要提取的任何行:

$content = Get-Content "path to user.log"
$count = 0
$target = 3

foreach ($line in $content) {
    $count += 1
    if ($count -eq $target) {
        $line
        break
    }
}
适合处理大型输入文件的一种简单且内存效率高的方法是将Get内容与Select对象相结合:

-Skip 2指示Select Object跳过Get Content输出的前两行输入

因此,第三行是Select对象第一次处理和输出的行,-first 1使其在处理之后立即停止处理,因此不需要读取文件的其余部分

如果文件中达到所需行号的部分足够小,可以作为一个整体放入内存,则采用更快的方法:

-TotalCount 3告诉Get Content总共最多读取3行

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

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

也就是说,获取内容读取所有行,这。。。在内存中的数组中收集,并且[2]访问数组的第三个元素,即第三行


加速此解决方案的一个简单方法是添加-ReadCount 0,这使Get内容作为单个输出对象发出所有输入行的数组本身,而不是逐个发出行并让。。。之后在数组中收集它们。

Get-Content cmdlet有一个-ReadCount参数。如果将该值设置为3,并将管道连接到ForEach对象{$Test=$\uu;break},则文件的前3行将位于$Test中。您可以通过$Test[2]获得第三个。。。[grin]虽然这种方法有效,但它不是读取大文件的好方法,因为它需要先将整个文件读取到一系列行中;如果您愿意为此付出代价,一个更简单的解决方案是:获取user.log[2]的内容路径。
Get-Content user.log | Select-Object -Skip 2 -First 1
(Get-Content -TotalCount 3 -ReadCount -3 user.log)[-1]
(Get-Content user.log)[2]  # add -ReadCount 0 to speed things up