web-dev-qa-db-ja.com

Powershellで、head、tail、more、less、sedの機能を実行するにはどうすればよいですか?

Windowsでログファイルをチェックするにはこれらのコマンドが必要ですが、プログラムをインストールせず、WindowsのPowershellが好きです。

89
Yue Zhang

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 Community Extensions には、特殊なファイルに関するコマンドレット(Get-FileTailなど)が含まれます。

139
Joey

headおよびtailを実行する組み込みの方法を次に示します。パイプを使用しないでください。大きなファイルがある場合、非常に遅くなります。これらの組み込みオプションの使用は、巨大なファイルに対しても非常に高速です。

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

more.exeはWindowsに存在し、lessのポートは簡単に見つかります(そして PowerShell Community Extensions 、PSCXには含まれています)。

PowerShellは、どちらの場合も個別のプログラムに代わるものを実際には提供しませんが、構造化データの場合はOut-Gridが役立ちます。

HeadおよびTailは、それぞれSelect-Objectおよび-Firstパラメーターを使用して、-Lastでエミュレートできます。

Sed関数はすべて使用可能ですが、構造がかなり異なります。フィルタリングオプションは、Where-Object(またはForeach-Objectおよび範囲の一部の状態)で使用できます。その他の変換操作は、Select-ObjectおよびForeach-Objectを使用して実行できます。

ただし、PowerShellが(.NET)オブジェクトを渡すと、すべての型付けされた構造(たとえば、日付はDateTimeインスタンスのままです–各コマンドがそれ自体を解析する必要がある単なる文字列ではなく、sedおよび他のそのようなプログラムの多くは冗長です。

8
Richard

このインスタンスの「-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 "を使用してください!

1
Patrick Burwell

Windowsで大きな(または小さな)ログファイルを照会する必要がある場合、私が見つけた最良のツールはMicrosoftの無料 Log Parser 2.2 です。必要に応じてPowerShellから呼び出すことができ、すべての面倒な作業を高速で実行します。

1
$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コードBTWではすべてのエラーが発生するわけではありません。コードは「sed」オプションでのみ機能します。残りはすべてgcとpath以外を無視します。

0
Patrick Burwell

私はいくつかのより良い解決策を得ました:

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
0
Yue Zhang