回答:
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のコミュニティの拡張機能は、特殊なファイルのもの(例えばは、Get-FileTail)のためのいくつかのコマンドレットが含まれています。
-last 2
1GBのCSV を実行するために私のCPUを使い果たしています。ホットドリンク:☕
Get-Content -Tail 2
代わりに使用できます。それは間違いなく速いです。
gc log.txt | %{ $_ -replace '\d+', '($0)' } # sed
コンテンツが戻されないため、実際には完全にsedツールではありません。Set-Contentが必要です。
-Last
はawk
、同じタスクのために遅くなるのと同じ理由で遅いです:最初にストリームを完全に消費する必要があります。それがGet-Content -Tail
存在する理由です。またhead
、命名規則に適合しないためありませんSelect-Item
。その目的はすでにによって提供されています。
-head
ます。私の答えを見るstackoverflow.com/a/41626586/1081043
ここでは、内蔵行う方法ですhead
とtail
。大きなファイルがある場合は非常に遅くなるため、パイプは使用しないでください。これらの組み込みオプションを使用すると、巨大なファイルでも非常に高速になります。
gc log.txt -head 10
gc log.txt -tail 10
gc log.txt -tail 10 -wait # equivalent to tail -f
| select -last
パイプを使用します。-tail
パイプなしで使用しています。しかし、2つの矛盾する答えを見つけた場合は、おそらくより高い評判の人を信頼することができます。また、大きなファイルに対して2つの方法を試すこともできます。大きなファイルでは非常に明白です。
more.exe
Windowsに存在し、のポートless
は簡単に見つかります(PowerShell Community Extensions、PSCXには1つ含まれています)。
PowerShellは実際にはどちらも個別のプログラムに代わる手段を提供していませんが、構造化データの場合Out-Grid
は役立ちます。
Head
そして、Tail
の両方をエミュレートすることができるSelect-Object
使用-First
し、-Last
それぞれのパラメータを。
Sed
関数はすべて使用できますが、構造がかなり異なります。フィルタリングオプションはで利用できますWhere-Object
(またはForeach-Object
範囲の一部の状態を介して)。その他、変換、操作はSelect-Object
およびを使用して実行できますForeach-Object
。
ただし、PowerShellが(.NET)オブジェクトを渡すと、型指定されたすべての構造が含まれます。日付はDateTime
インスタンスのままです。各コマンドがそれ自体を解析するために必要な文字列だけではなく、多くのsed
プログラムやその他のプログラムは冗長です。
このインスタンスの「-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」を使用してください。
Windowsで大きな(または小さな)ログファイルをクエリする必要がある場合、私が見つけた最良のツールはMicrosoftの無料のLog Parser 2.2です。必要に応じて、PowerShellから呼び出すことができます。これにより、非常に面倒な作業がすべて、非常に高速に行われます。
$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とパス以外は無視します。