Powershell – 关于Windows:如何在Powershell中执行头,尾,多,少,sed的操作 - 猫猫得天空♂

/ 0评 / 0

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

  • 日志文件太大,大约几个兆字节。 通过notepad.exe很难查看。
  • 如果您使用notepad作为基础,我建议您考虑使用替代文本编辑器,其中有很多(免费和付费)替代方案。 所有这些都比记事本优越(尽管这并不是什么挑战)。
  • PowerShell与Unix Shell的可能重复
  • 我处理大文件,并且使用/安装Vim证明比我使用的任何其他工具快得多。

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

  • 天哪,这使我的CPU用尽了资源,可以在1GB CSV上执行-last 2。热饮:
  • @mlissner:如果您在PowerShell v3上,则可以使用Get-Content -Tail 2。那绝对是更快。
  • gc log.txt | %{ $_ -replace \\d+, ($0) } # sed实际上并不完全是sed工具,因为它不会放回内容。它需要Set-Content。
  • @Artem:在这种情况下加上括号。我不知道sed本身可以写任何东西。我见过它主要用于更改流中的内容。
  • 哇,-last很慢!另外,为什么他们不只是执行一个名为head的命令?
  • @Neil,-Last变慢,原因是相同的原因,awk对于相同的任务将变慢:它必须首先完全消耗流。这就是Get-Content -Tail存在的原因。而且没有head,因为它不符合命名约定,并且Select-Item已经满足了其目的。
  • @neil @joey他们有-head的别名。见我的答案stackoverflow.com/a/41626586/1081043
  • @wisbucky:那是-TotalCount的参数别名,而不是Get-Content的命令别名。我在这里指的是命令,就像尼尔一样。
  • 您可以在将其通过管道传输到新文件的示例中进行更新吗?
  • @ user702846:Out-File。

这是执行Head和Tail的内置方法。不要使用管道,因为如果文件很大,那将非常慢。即使对于大型文件,使用这些内置选项也将非常快。

1
2
3
gc log.txt -head 10
gc log.txt -tail 10
gc log.txt -tail 10 -wait # equivalent to tail -f
  • 但乔伊斯(Joeys)的评论似乎表明完全相反!我怎么知道信任谁或哪种(内置)方法最有效?
  • @NH我的回答与Joeys的评论一致。他的评论说:"-最后很慢。这就是为什么存在Get-Content -Tail的原因。" | select -last使用管道。我在没有管道的情况下使用-tail。但是,如果您确实找到两个相互矛盾的答案,则您可能会相信信誉较高的人。另外,您可以简单地在大文件上尝试这两种方法。在大文件上这将是非常明显的。
  • 得到它了。抱歉,我第一次阅读帖子时一定很困惑。

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

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

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

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

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

  • 辉煌。 gc似乎不支持管道输入。当我想过滤命令输出时,我使用的是" ... exe ... |选择对象-前20 |选择对象-后1"

在这种情况下,"-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"!

  • 嗨@Patrick,欢迎来到Stack Overflow!感谢您尝试回答这个问题,能否请您提供更详细的说明?目前尚不清楚您是要提供解决方案还是只是对问题添加一些评论。
  • 这是一种评论,也是一种沮丧。 -TotalCount"什么都不做-" Head"还没有做。所以有人知道如何获取TotalCount吗?
  • 再读一遍...我添加到答案中,并阐明了可行的方法...

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

  • 无论如何,我的环境是Win2k8R2,它不在Log Parser2.2的系统要求中

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

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之外,其余所有内容均忽略其他任何内容。

u40377350752760278651fm253fmtautoapp138fJPEG

原文

返回首页

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注