Linux では tail -f でファイルの更新を監視してリアルタイムに表示を更新させることができます。ログファイルの監視などを行う際にお世話になるお便利コマンドですが、PowerShell にはそもそも tail がありません。困った。
PowerShell でも tail -f がしたい
そんなときには Get-Content コマンドレットを利用しましょう:
Get-Content -Path <ファイルパス> -Wait -Tail <行数>
おおよそ tail <ファイルパス> -f -n <行数> と同じ挙動を示します。文字コードが SJIS でない場合は文字化けしてしまいますが、 -Encoding UTF8 などと指定して回避することができます。
PowerShell でも tail -f | grep がしたい
ログファイルの監視をする際、任意の文字列が含まれる行だけをリアルタイムに抽出して表示したいことがあります。Linux では grep すればすむ話ですが、PowerShell には grep コマンドもありません。そんなときには Select-String コマンドレットを利用しましょう:
Get-Content -Path <ファイルパス> -Wait -Tail <行数> | Select-String "GET","POST" -CaseSensitive
grep コマンドとの目立った違いとしては、OR 検索が -e オプションではなくカンマ区切りであること、デフォルトで大文字小文字を区別しないことがあげられます。
正規表現を利用したい場合は -Pattern オプションを利用します:
Get-Content -Path <ファイルパス> -Wait -Tail <行数> | Select-String -Pattern "http*"
PowerShell でもパイプラインでテキストを渡したい
PowerShell のパイプラインは、Linux のそれとは異なりオブジェクトを渡す仕様になっています。それが便利なこともありますが、画面上に表示されているコマンドの実行結果を「見たまま」 grep にかけたいこともありますよね。そんなときには Out-String コマンドレットを利用しましょう:
Get-ChildItem | Out-String -Stream | Select-String ".log"
Get-ChildItem からパイプラインで渡したオブジェクトを直接 grep するとカレントディレクトリにある各ファイルに対して grep が走ってしまいますが、Out-String -Stream を挟むことによってファイル名で絞り込むことができます。