catだけじゃない！PowerShellでファイル中身を見る6つの方法

## はじめに

LinuxやmacOSユーザーにとって、ファイ中身をみるときに`cat`コマンドをよく使うと思います。PowerShellを使っている方にとって、「ファイルの中身を見るコマンドといえば？」と聞かれて即答できますか？

実はPowerShellには、単にファイルの内容を表示するだけでなく、より高度な操作や柔軟な表示方法が豊富に用意されています。この記事では、PowerShellでファイルの中身を確認するための6つの方法を紹介します。日常の作業効率を上げるために、ぜひ活用してください！

![powershell-methods-diagram (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/718691d7-882b-4d0e-b8e7-0c390e6a696e.png)

## 1. `Get-Content` の基本的な使い方

PowerShellで最も一般的なファイル内容表示コマンドは `Get-Content` です。Linuxの `cat` に相当するこのコマンドレットを使うと、ファイルの内容を簡単に表示できます。

```powershell
# 基本的な使い方
Get-Content -Path "C:\temp\example.txt"

# エイリアスを使った短い書き方
gc "C:\temp\example.txt"

# パイプラインと組み合わせた使い方
"C:\temp\example.txt" | Get-Content
```

`Get-Content` は単なるファイル表示以上の機能があります。例えば、複数のファイルを一度に表示することも可能です。

```powershell
# 複数のファイルを一度に表示
Get-Content -Path "file1.txt", "file2.txt"

# ワイルドカードを使った複数ファイルの表示
Get-Content -Path "C:\temp\*.log"
```
## 2. `-Tail` や `-TotalCount` オプションで必要な部分だけ表示

大きなファイルを扱う場合、全ての内容を表示する必要がないことがあります。PowerShellでは、ファイルの先頭や末尾だけを表示するオプションが用意されています。

```powershell
# ファイルの先頭10行だけを表示
Get-Content -Path "large_log.txt" -TotalCount 10

# ファイルの末尾5行だけを表示
Get-Content -Path "large_log.txt" -Tail 5
```

これらのオプションは、ログファイルの確認など、大量のテキストから必要な情報だけを素早く抽出したい場合に非常に便利です。

## 3. `-Wait` オプションでリアルタイム監視

アプリケーションのログファイルなど、リアルタイムに更新されるファイルを監視したいケースがあります。そんな時は `-Wait` オプションが役立ちます。Linuxの `tail -f` に相当するこの機能を使うと、ファイルの更新をリアルタイムで追跡できます。

```powershell
# ファイルの更新をリアルタイムで監視
Get-Content -Path "application.log" -Wait

# 末尾10行から表示して、その後の更新を監視
Get-Content -Path "application.log" -Tail 10 -Wait
```

このコマンドを実行すると、新しい行がファイルに追加されるたびに、PowerShellウィンドウに表示されます。監視を終了するには、`Ctrl+C`を押してください。

## 4. `Select-String` で検索しながら表示

大きなファイルから特定のパターンを含む行だけを抽出したい場合は、`Select-String` コマンドレットとの組み合わせが便利です。これはLinuxの `grep` に相当する機能です。

```powershell
# 「error」という単語を含む行のみを表示
Get-Content -Path "application.log" | Select-String -Pattern "error"

# 大文字/小文字を区別せずに検索
Get-Content -Path "application.log" | Select-String -Pattern "ERROR" -CaseSensitive:$false

# 正規表現を使った検索
Get-Content -Path "application.log" | Select-String -Pattern "\d{4}-\d{2}-\d{2}"  # 日付形式（YYYY-MM-DD）を検索
```

さらに、`Select-String` はコンテキスト行（マッチした行の前後の行）も表示できます：

```powershell
# マッチした行の前後2行も表示
Get-Content -Path "application.log" | Select-String -Pattern "error" -Context 2,2
```

## 5. `Out-File` や `Out-Host` との組み合わせ

ファイルの内容を変換や加工して表示したい場合、他のコマンドレットと組み合わせることができます。

```powershell
# 内容を別のファイルに保存
Get-Content -Path "source.txt" | Out-File -FilePath "destination.txt"

# 画面表示をカスタマイズ（1ページずつ表示）
Get-Content -Path "large_file.txt" | Out-Host -Paging
```

また、`Format-Table` や `ConvertTo-Html` などと組み合わせて、表示形式を変更することも可能です：

```powershell
# CSVファイルを表形式で表示
Get-Content -Path "data.csv" | ConvertFrom-Csv | Format-Table

# テキストファイルをHTML形式に変換して表示
Get-Content -Path "readme.txt" | ConvertTo-Html | Out-File -FilePath "readme.html"
```

## 6. `.NET` クラスを使った高度な読み取り

PowerShellは.NETフレームワークの機能を直接利用できるため、より高度なファイル操作が必要な場合は、`System.IO.File` クラスなどを活用できます。これにより、エンコーディングの指定や、バイナリファイルの読み取りなど、より細かい制御が可能になります。

```powershell
# エンコーディングを指定してファイルを読み込む
[System.IO.File]::ReadAllText("C:\temp\japanese.txt", [System.Text.Encoding]::GetEncoding("shift_jis"))

# ファイルをバイト配列として読み込む
$bytes = [System.IO.File]::ReadAllBytes("C:\temp\binary.dat")
$bytes[0..16]  # 最初の16バイトを表示

# 行単位で読み込む
$lines = [System.IO.File]::ReadAllLines("C:\temp\multiline.txt")
$lines.Count  # 行数を表示
```

さらに、ストリームを使った効率的な読み取りも可能です：

```powershell
# StreamReaderを使った大きなファイルの効率的な読み取り
$reader = [System.IO.StreamReader]::new("C:\temp\very_large.txt")
$lineCount = 0

while (($line = $reader.ReadLine()) -ne $null) {
    $lineCount++
    # 必要な処理をここに書く
}

$reader.Close()
Write-Host "Total lines: $lineCount"
```

## まとめ

![マインドマップ (45).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/c9241295-cab3-486a-85c4-8e93559786d6.png)

PowerShellでファイルの内容を表示する方法は、基本的な `Get-Content` の使用から、.NETクラスを活用した高度な読み取りまで多岐にわたります。今回紹介した6つの方法をマスターすれば、さまざまな状況に適したファイル読み取りが可能になります。

1. `Get-Content` の基本的な使い方
2. `-Tail` や `-TotalCount` オプションで必要な部分だけ表示
3. `-Wait` オプションでリアルタイム監視
4. `Select-String` で検索しながら表示
5. `Out-File` や `Out-Host` との組み合わせ
6. `.NET` クラスを使った高度な読み取り

これらの方法を状況に応じて使い分けることで、PowerShellでのファイル操作がより効率的になるでしょう。

最後に、PowerShellの公式ドキュメントも参考になりますので、さらに詳しく知りたい方はチェックしてみてください。

## 補足：PowerShellにおける cat について

PowerShellでも cat コマンドは使用できますが、**UNIXやLinuxにおける cat とは異なり、PowerShellでは Get-Content のエイリアス**です。つまり、実体は Get-Content であり、動作も PowerShellのオブジェクト指向に基づいています。

```powershell
# これらはすべて同じ動作
Get-Content -Path "C:\temp\example.txt"
gc "C:\temp\example.txt"
cat "C:\temp\example.txt"
```

## 参考リンク

- [Microsoft公式ドキュメント: Get-Content](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-content)
- [Microsoft公式ドキュメント: Select-String](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-string)
- [Microsoft公式ドキュメント: System.IO.File クラス](https://docs.microsoft.com/en-us/dotnet/api/system.io.file)