Answers:
Get-Content
(别名:)gc
是您阅读文本文件的常用选项。然后,您可以进一步过滤:
gc log.txt | select -first 10 # head
gc -TotalCount 10 log.txt # also head
gc log.txt | select -last 10 # tail
gc -Tail 10 log.txt # also tail (since PSv3), also much faster than above option
gc log.txt | more # or less if you have it installed
gc log.txt | %{ $_ -replace '\d+', '($0)' } # sed
这对于小文件已经足够好了,较大的文件(超过几个MiB)可能会有点慢。
在PowerShell的社区扩展包括专门文件的东西(如GET-FileTail)某些cmdlet。
-last 2
一个1GB CSV。热饮:☕–
Get-Content -Tail 2
改用。那肯定更快。
gc log.txt | %{ $_ -replace '\d+', '($0)' } # sed
这实际上并不完全是sed工具,因为它不会放回内容。它需要Set-Content。
-Last
由于相同的原因awk
而变慢,对于相同的任务将变慢:它必须首先完全消耗流。这就是为什么Get-Content -Tail
存在。也没有,head
因为它不符合命名约定,并且的目的已经由满足Select-Item
。
-head
。见我的答案stackoverflow.com/a/41626586/1081043
这是执行head
和的内置方法tail
。不要使用管道,因为如果文件很大,它将非常慢。即使对于大型文件,使用这些内置选项也将非常快。
gc log.txt -head 10
gc log.txt -tail 10
gc log.txt -tail 10 -wait # equivalent to tail -f
| select -last
使用管道。我-tail
没有管道。但是,如果您确实找到两个相互矛盾的答案,则您可能会相信信誉较高的人。另外,您可以简单地在大文件上尝试这两种方法。在大文件上这将是非常明显的。
more.exe
在Windows上存在,less
很容易找到的端口(PowerShell Community Extensions PSCX包括其中之一)。
PowerShell确实没有为单独的程序提供任何替代方案,但是对于结构化数据Out-Grid
可能会有所帮助。
Head
并且Tail
都可以分别Select-Object
使用-First
和-Last
参数进行仿真。
Sed
功能都可用,但结构却大不相同。过滤选项可用Where-Object
(或通过Foreach-Object
范围的某种状态)。其他转换操作可以使用Select-Object
和完成Foreach-Object
。
但是,随着PowerShell通过(.NET)对象–具有其所有类型结构,例如。date仍然是DateTime
实例–不仅仅是每个命令都需要解析的字符串,很多sed
此类程序都是多余的。
在这种情况下,“-TotalCount”的响应与“ -head”完全相同。您必须使用-TotalCount或-head来运行类似的命令。但是-TotalCount具有误导性-实际上无法为您提供任何计数...
gc -TotalCount 25 C:\scripts\logs\robocopy_report.txt
在PS 5.1中测试的上述脚本是如下的SAME响应...
gc -head 25 C:\scripts\logs\robocopy_report.txt
因此,只需使用“ -head 25”!
如果您需要在Windows上查询大型(或小型)日志文件,我发现的最好的工具是Microsoft的免费Log Parser 2.2。您可以根据需要从PowerShell调用它,它将为您完成所有繁重的工作,而且速度也非常快。
$Push_Pop = $ErrorActionPreference #Suppresses errors
$ErrorActionPreference = “SilentlyContinue” #Suppresses errors
#Script
#gc .\output\*.csv -ReadCount 5 | %{$_;throw "pipeline end!"} # head
#gc .\output\*.csv | %{$num=0;}{$num++;"$num $_"} # cat -n
gc .\output\*.csv | %{$num=0;}{$num++; if($num -gt 2 -and $num -lt 7){"$num $_"}} # sed
#End Script
$ErrorActionPreference = $Push_Pop #Suppresses errors
推送代码BTW并不能解决所有错误,您的代码只能与“ sed”选项一起使用。除了gc和path,其余所有内容都忽略任何其他内容。