PowerShellで大きなログファイルの一部(先頭や最終行など)を参照する際に。
先頭だったり最終行付近を確認したい事あるかと思います。
何も意識しないでコマンドを実行したりすると意外と処理時間を食う結果になるので紹介。
先頭から
Get-Contentのオプションを利用すればOK
# Get-Contentでは先頭行から指定行読み込むTotalCountオプションが用意されている
Get-Content -TotalCount 10 -Path .\hugelog.txt
# エイリアスとしてFirstやHeadも用意されている
Get-Content -First 10 -Path .\hugelog.txt
Get-Content -Head 10 -Path .\hugelog.txt
# Slect-Objectに渡して、Select-Object側のFirstオプションでも先頭か指定行取得できる
Get-Content -Path .\hugelog.txt | Select-Object -First 10
最終行から
こちらもGet-Contentのオプションを利用すればOK
# Get-Contentには末尾から指定行読み込みオプションとしてTailオプションが用意されている
Get-Content -Tail 10 -Path .\hugelog.txt
# エイリアスとしてLastも用意されている
Get-Content -Last 10 -Path .\hugelog.txt
Get-Content foobar | Select-Object -Last n とすると時間がかかる
先頭行からの所と同様にSelect-Objectに渡してLastオプションで表示しようとすると非常に時間がかかります。
# Select-Object側のLastオプションでも表示できるが、これは遅い
Get-Content -Path .\hugelog.txt | Select-Object -Last 10
これはGet-Contenctの部分で先頭からファイルを読んでいってしまっているので、結局の所Select-Object -Last 10
の部分はファイル全体を読みこんだ後に実行されるからだと思います。
総評
いつの間にか当たり前のように利用していましたが、知らないとだいぶ不便な気がします。