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)。

这里是内置的方式做headtail 。 不要使用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可能会有所帮助。

HeadTail都可以用Select-Object-First-Last参数来模拟。

Sedfunction都是可用的,但结构相当不同。 过滤选项在Where-Object (或通过Foreach-Object和某些范围的状态)中可用。 其他的转换操作可以通过Select-ObjectForeach-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