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