Powershell中如何做head,tail,more,less,sed?
我需要这些命令来检查Windows上的日志文件,但是我不安装任何程序,而且我喜欢Windows中的Powershell。
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社区扩展包括一些用于专门文件的cmdlet(例如Get-FileTail)。
这里是内置的方式做head
和tail
。 不要使用pipe道,因为如果你有一个大文件,它会非常缓慢。 即使对于大文件,使用这些内置选项也将非常快速。
gc log.txt -head 10 gc log.txt -tail 10 gc log.txt -tail 10 -wait # equivalent to tail -f
在Windows上存在more.exe
,轻松findless
端口(并且PowerShell社区扩展 PSCX包含一个)。
PowerShell并没有提供任何其他方法来分离程序,但对于结构化数据, Out-Grid
可能会有所帮助。
Head
和Tail
都可以用Select-Object
用-First
和-Last
参数来模拟。
Sed
function都是可用的,但结构相当不同。 过滤选项在Where-Object
(或通过Foreach-Object
和某些范围的状态)中可用。 其他的转换操作可以通过Select-Object
和Foreach-Object
。
然而,当PowerShell传递(.NET)的对象 – 与他们的所有types的结构,例如。 date仍然是DateTime
实例 – 而不仅仅是每个命令需要parsing的string, sed
和其他这样的程序大部分都是多余的。
如果您需要在Windows上查询大型(或小型)日志文件,我发现的最好的工具是Microsoft免费的Log Parser 2.2 。 你可以从PowerShell调用它,如果你愿意,它会为你做所有的繁重工作,而且速度也非常快。
我有一些更好的解决scheme:
gc log.txt -ReadCount 5 | %{$_;throw "pipeline end!"} # head gc log.txt | %{$num=0;}{$num++;"$num $_"} # cat -n gc log.txt | %{$num=0;}{$num++; if($num -gt 2 -and $num -lt 7){"$num $_"}} # sed