Get-Contentの使い方:ファイルの内容を表示する
Get-Content コマンドレットを使用すると、指定したファイルの内容を表示することができます。ファイル全体を表示するだけでなく、表示する行数や位置を指定したり、特定の範囲だけを取得することもできます。またログファイルの監視にも利用されます。ここでは PowerShell における Get-Content コマンドレットの使い方について解説します。
Get-Contentコマンドレットの書式
Get-Content コマンドレットは、指定したファイルの内容を表示するためのコマンドレットです。 Get-Content コマンドレットの書式は次の通りです。
Get-Content [-Path] <String[]> [-ReadCount <Int64>] [-TotalCount <Int64>] [-Tail <Int32>] [-Filter <String>] [-Include <String[]>] [-Exclude <String[]>] [-Force] [-Credential <PSCredential>] [-Delimiter <String>] [-Wait] [-Raw] [-Encoding <Encoding>] [-AsByteStream] [-Stream <String>] [<CommonParameters>]
Get-Content はエイリアスとして cat、 gc、 typeが定義されています。
cat -> Get-Content gc -> Get-Content type -> Get-Content
Get-Content を使ってファイルの内容を表示するには次の書式を使用します。
Get-Content -Path ファイルのパス
-Path は省略可能なので、通常は次のように実行します。
Get-Content ファイルのパス
※ Get-Content ファイルの内容を 1 行ずつ読み込み、各行を文字列の要素とする配列として出力します。
それでは、実際に試してみます。次のように実行します。
Get-Content c:\tmp\memo.txt
c:\tmp\memo.txt の内容が画面に表示されます。
複数のファイルの内容を同時に表示することもできます。複数のファイルを指定する場合は、カンマ(,)で区切ってファイルパスを指定してください。
Get-Content ファイルのパス1, ファイルのパス2, ...
それでは、実際に試してみます。次のように実行します。
Get-Content c:\tmp\memo.txt, c:\tmp\shopping.txt
c:\tmp\memo.txt および c:\tmp\shopping.txt の内容が画面に表示されます。
※ 複数のファイルの内容を表示する場合は、それぞれのファイルの内容を続けて表示します。
ファイル名のパスにはワイルドカードであるアスタリスク(*)も使用できます。例えば同じディレクトリにある拡張子が .txt のファイルの内容をすべて表示するには次のように実行します。
Get-Content c:\tmp\*.txt
条件に一致するファイルの内容を画面に表示しました。
※ 複数のファイルの内容を同時に表示する場合、どこからどこまでがどのファイルの内容なのか分かりにくくなります。その場合は次のような PowerShell スクリプトを実行してください。
Get-ChildItem c:\tmp\*.txt | ForEach-Object {
Write-Host "-- $($_.FullName) --"
Get-Content $_.FullName
}
各ファイルの内容の前にファイル名を表示することで、どのファイルの内容か分かりやすくしています。
ファイルの文字コードを指定する
Get-Content では、ファイルを読み込むときに既定の文字コードでファイルを読み込みます。現在の PowerShell では既定の文字コードは UTF-8(BOMなし) です。そのため、他の文字コードで保存されているファイルの内容を表示しようとすると文字化けが発生する場合があります。
例えば Shift_JIS で保存されたファイルの内容を表示してみます。
Get-Content c:\tmp\shopping_s.txt
すると文字化けした内容で表示されました。
UTF-8(BOMなし) 以外の文字コードで保存されているファイルの内容を表示するには -Encoding オプションを使用します。
Get-Content ファイルのパス -Encoding 文字コード
文字コードとして指定できる値は次の通りです。デフォルトの値は utf8NoBOM です。
ascii ansi bigendianunicode bigendianutf32 oem unicode utf7 utf8 utf8BOM utf8NoBOM utf32
※ utf7 は非推奨です。
また登録済みのコードページの数値を指定したり(-Encoding 932 など)、登録されたコードページの文字列名(-Encoding Shift_JIS など) も使用できます。
ansi を指定した場合は、現在の Windows のシステムロケールに対応した ANSI コードページが使用されます。日本語環境では通常、コードページ 932(Shift_JIS)が使用されます。そのため、 Shift_JIS で保存されたファイルを表示する場合は、 -Encoding オプションの値として ansi を指定するか、コードページの数値である 932 を指定してください。
Shift_JIS で保存されたファイルの内容を表示してみます。
Get-Content c:\tmp\shopping_s.txt -Encoding ansi
今度は文字化けせずにファイルの内容が表示されました。
表示する範囲を指定する
Get-Content ではファイルの内容をすべて表示するだけでなく、先頭や末尾から指定した行だけを表示することができます。
-TotalCountオプション
-TotalCount を使用すると、ファイルの先頭から指定した行数だけ内容を表示します。
Get-Content ファイルのパス -TotalCount 行数
例えば行数に 3 を指定すると、ファイルの先頭から 3 行分だけ画面に表示します。
それでは実際に試してみます。次のように実行してください。
Get-Content c:\tmp\memo.txt -TotalCount 3
ファイルの先頭から 3 行分だけ画面に表示されました。
-Tailオプション
-Tail を使用すると、ファイルの最後から指定した行数だけ内容を表示します。
Get-Content ファイルのパス -Tail 行数
例えば行数に 3 を指定すると、ファイルの最後から 3 行分だけ画面に表示します。
それでは実際に試してみます。次のように実行してください。
Get-Content c:\tmp\memo.txt -Tail 3
ファイルの最後から 3 行分だけ画面に表示されました。
ログファイルの確認などで、最新の内容だけを確認したい場合によく使用されます。
指定の行番号の内容を表示する
Get-Content ではファイルの内容を 1 行ずつ読み込み、各行を文字列の要素とする配列を返します。そのため、特定の行の内容は、インデックスを指定して配列の要素を参照すると取得できます。(インデックスは最初の行が 0 です)。
それでは実際に試してみます。次のように実行してください。
(Get-Content c:\tmp\memo.txt)[3]
ファイルの先頭から 4 行目の内容が画面に表示されました。
1つの文字列として取得する
Get-Content ではファイルの内容を 1 行ずつ読み込み、各行を文字列の要素とする配列を返します( 1 行につき 1 要素)。そのため、画面に表示すると、行ごとに改行されて表示されます。
次の例は、 3 つの行が含まれるファイルの内容を表示しています。
Get-Content c:\tmp\fruit.txt
実行すると、次のように表示されます。
PS C:\code\powershell> Get-Content c:\tmp\fruit.txt Orange Melon Banana
このとき、ファイルの中身を次のような配列として取得しています。ファイルの各行が配列の要素として格納されます。
@("Orange","Melon","Banana")
配列を画面に表示すると、要素毎に出力するため要素毎に改行されて表示されます。
-Raw オプションを指定すると、ファイルの内容を 1 行の文字列として返します。
Get-Content ファイルのパス -Raw
先ほどと同じファイルに対して、次のように実行します。
Get-Content c:\tmp\fruit.txt -Raw
実行すると、次のように表示されます。
PS C:\code\powershell> Get-Content c:\tmp\fruit.txt -Raw Orange Melon Banana
画面上の表示は -Raw オプションを付けない場合と同じように見えますが、内部的には 1 行ごとの配列ではなく、改行文字を含んだ 1 つの文字列として取得されています。
"Orange`r`nMelon`r`nBanana`r`n"
画面に出力しているのは 1 つの文字列ですが、文字列の中に改行文字 `r`n が含まれるため、結果として 3 行に分かれて表示されます。
このように -Raw オプションを使用することで、ファイルの内容を 1 つの文字列として取得できるため、文字列全体に対する検索や置換などの処理を簡単に行うことができます。
ログを監視する
Get-Content を使用すると、通常はファイルの内容を画面に出力したあと、コマンドは終了しますが、 -Wait オプションを指定すると、ファイルの内容を画面に出力したあと、コマンドは終了せずに 1 秒毎にファイルの更新をチェックします。
Get-Content ファイルのパス -Wait
主にログの監視などの場合に便利な機能で、新しいログがファイルに書き込まれるたびに、画面に表示します。
注意点として、最初にファイルの内容をいったんすべて画面に表示するため、対象のファイルに大量のログが記録されていた場合には、大量の情報が画面に表示されます。コマンド実行時に、ファイルの内容をすべてを表示する必要がない場合は、 -Tail オプションを合わせて指定してください。
Get-Content ファイルのパス -Tail 10 -Wait
このように -Tail オプションを組み合わせることで、ファイルの最後の 10 行だけを表示したあと、新しく追加された内容を監視することができます。
それでは実際に試してみます。次のように実行してください。
Get-Content c:\tmp\access.log -Wait
この時点でファイルに記録されている内容が画面に表示されます。
通常はコマンドの実行が終わった時点でコマンドは終了しますが、 -Wait オプションを使用している場合は、そのまま実行を続け 1 秒ごとにファイルの更新をチェックします。
試しに別の PowerShell コンソールから、対象のファイルに対して追加の書き込みを行ってみます。
Add-Content -Path "c:\tmp\access.log" -Value "20xx 13:48:24 /blog/user-name.html"
すると元の PowerShell コンソールでは、対象のファイルに新しくデータが追加されたことを検知して、追加された内容を画面に表示します。
このように -Wait オプションを使用することで、リアルタイムで最新のログを画面に表示することができます。
なおコマンドの実行を終了するには Ctrl + C を押してください。コマンドの実行が停止します。
-- --
PowerShell における Get-Content コマンドレットの使い方について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。