Powershell 中与 Linux 中 head/tail/more/less/sed 等效的命令是什么?

在 Windows 上,使用 Powershell,与 linux 的 headtailmorelesssed等效的命令是什么?

166695 次浏览

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

在 Windows 上存在 more.exe,很容易找到 less的端口(PowerShell 社区扩展,PSCX,包括一个)。

PowerShell 实际上并没有为两者提供任何独立程序的替代方案,但是对于结构化数据 Out-Grid可能很有帮助。

HeadTail都可以用 Select-Object分别使用 -First-Last参数进行仿真。

Sed函数都是可用的,但是结构不同。在 Where-Object中可以使用过滤选项(或者通过 Foreach-Object和一些范围的状态)。其他的转换操作可以用 Select-ObjectForeach-Object来完成。

然而,随着 PowerShell 的通过(。NET)对象-所有类型化的结构,例如日期仍然是 DateTime实例-而不仅仅是字符串,每个命令需要解析自己,大部分 sed和其他类似的程序是多余的。

如果需要查询 Windows 上的大(或小)日志文件,我发现最好的工具是微软的免费 日志解析器2.2。如果你愿意,你可以从 PowerShell 调用它,它会为你做所有的重活,而且非常快。

我有更好的解决办法:

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

下面是做 headtail的内置方法。不要使用管道,因为如果您有一个很大的文件,它会非常慢。即使对于大文件,使用这些内置选项也会非常快。

gc log.txt -head 10
gc log.txt -tail 10
gc log.txt -tail 10 -wait # equivalent to tail -f

“-TotalCount”在此实例中的响应与“-head”完全相同。您必须使用-TotalCount 或-head 来运行这样的命令。但是-TotalCount 是误导-它不工作,实际上给你任何计数..。

gc -TotalCount 25 C:\scripts\logs\robocopy_report.txt

上面的脚本,在 PS 5.1中测试的是与下面相同的响应..。

gc -head 25 C:\scripts\logs\robocopy_report.txt

那就用“-head 25”吧!

$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

使用 Pushpop 代码不会得到所有的错误 顺便说一下,你的代码只能使用“ sed”选项,其他的代码只能忽略 gc 和 path。