【Management】Get-Content -tail って知ってました?

Linux/UNIX 系の方にはおなじみの Tail コマンドですが、これと同じことを Windows でできないものかとよく尋ねられます。

MVP のあおきさんが書かれているように、CodePlex で LogExpert というツールが公開されていますので、すでにこちらをお使いの方も多いことでしょう。

https://d.hatena.ne.jp/aoki1210/20120218/p1

※この記事の存在は石坂さんから教えていただきました。石坂さん、ありがとうございます!そしてあおきさん、ありがとうございます!

では、本当に Windows 標準ではできないのかといえば、実はそんなことはありません。

Windows PowerShell に用意されている Get-Content コマンドレットを使用すれば同じような処理が可能です。

例えば以下のように書きます。

Get-Content .\FinaName.log -wait -tail 0

-wait は新しい行が追加されるまで待ち合せることを意味しています。

注意していただきたいのは、その後の -tail です。このパラメタは Windows PowerShell 3.0 からサポートされたものです。

以前は Get-Content .\FinaName.log -wait などとやると、テキストファイルをいったん全部読み込んでから -wait 処理が始まるため、巨大なファイルを扱う場合には待ち時間が異常に長いという問題がありました。

しかし、-tail パラメタのサポートにより、「最後の○行だけ読み込む」という指定ができるようになったのです。もちろん、 -tail 0 は「0行読み込む」という意味なので、何も読み込まずにいきなり -wait 処理が始まります。

試しに、何か巨大なテキストファイルを用意してみてください。

手元にない方は、郵便局が用意している郵便番号データ(CSV ファイル)なんかがよいかもしれません。

https://www.post.japanpost.jp/zipcode/dl/oogaki.html

巨大な csv ファイルを用意したら Windows PowerShell のコンソール上で以下のコマンドを実行してみましょう(郵便番号データを使用しています)。

Get-Content .\KEN_ALL.CSV -wait

image

上記の通り、すべてのデータを読み込んだ後で wait がはじまります。私のマシンで実行すると、wait が始まるまで実に2分半!これじゃやってられません。

そこで、次に以下のように指定してみてください。-tail 0 がミソです。

Get-Content .\KEN_ALL.CSV -wait -tail 0

image

言わずもがなですが、いきなり wait してくれます。

Get-Content には、他にもいろいろな使い方がありますので、ぜひ末永くご愛顧ください。便利ですよ!

Windows PowerShell 3.5 20131028

さて、ここでこんな要望も出てくるはず。

「Get-Content なんて長くて打ってられん! tail と入力したいのだ!」

はい、もっともです。以下のコマンドを実行してみてください。

Set-Alias tail Get-Content

これで、Get-Content に tail というエイリアスが設定されました。今後は tail と入力すれば Get-Content と同じように使用できます。

が、ここで難点も。。。Set-Alias コマンドは現在のコンソール上でのみ有効なのです。つまり、一度コンソールを閉じると Set-Alias した内容が消えてしまいます。

そこで、PowerShell セッションが起動するたびに、上記コマンドが実行されるようにしましょう。

Windows PowerShell にはユーザーごとにプロファイルが用意されており、ここにコマンドを記述しておくとコンソールが開くたびに実行してくれます。

ログオンスクリプトみたいなものです。

試しに、以下のコマンドを実行してプロファイルをメモ帳で開いてみてください。

notepad $profile

おそらく、「ファイルが存在しません。新規に作成しますか?」と表示されるはずです。

もし以前作成したプロファイルが存在していたとしても、特に気にせず、以下のようにコマンドを実行してください。

Add-Content $profile "Set-Alias tail get-content" -Force

これにより、$profile が存在しない場合には新規に作成して “Set-Alias tail Get-Content” を追記してくれます。

すでに $Profile が存在する場合には、ファイルの最後の行に “Set-Alias tail Get-Content” を追記してくれます。

これで、次回からは PowerShell コンソールを起動した直後から tail コマンドが使用できます。

なお、通常の PowerShell コンソールと、PowerShell ISE とではプロファイルのパスが異なります。

  • PowerShell コンソールの場合 C:\Users\junichia\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
  • PowerShell ISE の場合      C:\Users\junichia\Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1

そのため、ISE側だけで設定してもコンソール側には反映されませんので注意してください。

ISE とコンソールの両方で Alias 登録を行ってください。