【问题标题】:How to extract specific line from text file如何从文本文件中提取特定行
【发布时间】:2019-10-04 00:12:53
【问题描述】:

我有一个大的日志文件(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 中拥有文件的前3 行。您可以通过$Test[2] 获得第三个... [grin]

标签: powershell text-files line-numbers


【解决方案1】:

一种适合处理大型输入文件的简单且内存效率的方法是将Get-ContentSelect-Object结合起来: p>

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

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


一种更快的方法如果文件中直到所需行号的部分足够小整体融入记忆

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

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


如果输入文件整体很小,下面的解决方案最简单

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

也就是说,Get-Content 读取 所有 行,(...) 将这些行收集到内存中的数组中,[2] 访问数组的 第三个​​元素,即第 3 行。

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

【讨论】:

    【解决方案2】:

    您可以试试这个并将 $target 变量更改为您要提取的任何行:

    $content = Get-Content "path to user.log"
    $count = 0
    $target = 3
    
    foreach ($line in $content) {
        $count += 1
        if ($count -eq $target) {
            $line
            break
        }
    }
    

    【讨论】:

    • 虽然这可行,但它不是读取 large 文件的好方法,因为它需要将 整个文件 读取到一个行数组中,向上正面;如果你愿意付出这个代价,一个更简单的解决方案是:(Get-Content "path to user.log")[2]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2018-12-14
    • 2019-07-12
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    相关资源
    最近更新 更多