关于Windows:如何在Powershell中执行头,尾,多,少,sed的操作?

How to do what head, tail, more, less, sed do in Powershell?

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


Get-Content(别名:gc)是读取文本文件的常用选项。然后,您可以进一步过滤:

1
2
3
4
5
6
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的内置方法。不要使用管道,因为如果文件很大,那将非常慢。即使对于大型文件,使用这些内置选项也将非常快。

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


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

PowerShell确实没有为单独的程序提供任何替代方法,但是对于结构化数据Out-Grid可能会有所帮助。

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

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

但是,随着PowerShell通过(.NET)对象–具有其所有类型结构,例如。日期保留为DateTime实例–不仅仅是每个命令都需要解析的字符串,Sed的大部分内容以及其他此类程序都是多余的。


在这种情况下,"-TotalCount"的响应与" -head"完全一样。您必须使用-TotalCount或-head来运行类似的命令。但是-TotalCount具有误导性-实际上无法为您提供任何计数...

1
2
gc -TotalCount 25 C:\\scripts\\logs\
obocopy_report.txt

在PS 5.1中测试的上述脚本是如下的SAME响应...

1
2
gc -head 25 C:\\scripts\\logs\
obocopy_report.txt

因此,只需使用" -head 25"!


如果您需要在Windows上查询大型(或小型)日志文件,我发现的最好的工具是Microsoft的免费Log Parser 2.2。您可以根据需要从PowerShell调用它,它将为您完成所有繁重的工作,而且速度非常快。


我有一些更好的解决方案:

1
2
3
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


1
2
3
4
5
6
7
8
$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之外,其余所有内容均忽略其他任何内容。