今回はファイルの中身を表示するコマンドをご紹介する。

これまで同様、UNIX系コマンドを出しながら利用シーンごとに解説するので参考にしてほしい。

ファイルの中身を表示するGet-Content

ファイルの中身を表示するには、基本的にGet-Contentコマンドレットを使用する。

このコマンドレットの使い方は次のように簡単だ。UNIX系コマンドのcatやMS-DOSのtypeなどのコマンドの動作によく似ている。

Get-Contentでファイルの中身を表示

PS /Users/daichi> Get-Content ./COPYRIGHT
# $FreeBSD: releng/11.1/COPYRIGHT 310966 2016-12-31 12:52:23Z bapt $
#   @(#)COPYRIGHT   8.2 (Berkeley) 3/21/94

The compilation of software known as FreeBSD is distributed under the
following terms:

Copyright (c) 1992-2017 The FreeBSD Project. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

...略...

Effective immediately, licensees and distributors are no longer required to
include the acknowledgement within advertising materials.  Accordingly, the
foregoing paragraph of those BSD Unix files containing it is hereby deleted
in its entirety.

William Hoskins
Director, Office of Technology Licensing
University of California, Berkeley
PS /Users/daichi>

ただし、これだけだとターミナルのサイズを超えた部分のデータは流れてしまって確認することができない。

ファイルの中身をページごとに表示する Get-Content、Out-Host

ターミナルのサイズを超えるファイルの中身を確認する場合、通常はページャと呼ばれるコマンドにデータを流し込むような使い方をする。

PowerShellではOut-Hostコマンドレットでこれを実現することができる。

-Pagingというオプションを指定したOut-Hostコマンドレットにデータを流し込めば、次のように1ページごとに表示が一旦停止するようになる。スペースを押せば次のページが表示され、Qを押すと処理が終了する。

Out-Hostをページャのように使う方法

Get-Content ファイルパス | Out-Host -Paging

Out-Host -PagingでGet-Contentの出力をページごとに表示

ただし、使ってみるとわかると思うが、Out-Hostが提供しているページング機能はかなり使いにくい。ページャを使うときはだいたいインタラクティブに作業しているときなので、使いにくいというのはいただけない。

この用途に関しては、Out-Hostではなくmoreやlessといった、大抵どの環境にも用意されているアプリケーションを使ってしまった方がよいかもしれない。

先頭だけを表示 Get-Content -TotalCount

Get-Contentコマンドレットには先頭から指定した行数だけを表示するオプション-TotalCountが用意されている。

Select-Object -Firstで先頭だけを表示

PS /Users/daichi> Get-Content ./COPYRIGHT -TotalCount 20
# $FreeBSD: releng/11.1/COPYRIGHT 310966 2016-12-31 12:52:23Z bapt $
#   @(#)COPYRIGHT   8.2 (Berkeley) 3/21/94

The compilation of software known as FreeBSD is distributed under the
following terms:

Copyright (c) 1992-2017 The FreeBSD Project. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
PS /Users/daichi>

UNIX系コマンドとしてはheadコマンドの動作に似ている。

末尾だけを表示 Get-Content -Tail

Get-Contentコマンドレットには、逆に末尾から指定した行数だけを表示するオプション-Tailも用意されている。

Select-Object -Lastで末尾だけを表示

PS /Users/daichi> Get-Content ./COPYRIGHT -Tail 20
code files require that further distributions of products containing all or
portions of the software, acknowledge within their advertising materials
that such products contain software developed by UC Berkeley and its
contributors.

Specifically, the provision reads:

"     * 3. All advertising materials mentioning features or use of this software
      *    must display the following acknowledgement:
      *    This product includes software developed by the University of
      *    California, Berkeley and its contributors."

Effective immediately, licensees and distributors are no longer required to
include the acknowledgement within advertising materials.  Accordingly, the
foregoing paragraph of those BSD Unix files containing it is hereby deleted
in its entirety.

William Hoskins
Director, Office of Technology Licensing
University of California, Berkeley
PS /Users/daichi>

UNIX系コマンドとしてはtailコマンドの動作に似ている。

ログファイルをモニタリング Get-Content -Tail -Wait

ログファイルのように、随時更新されるファイルをずっと表示させておきたいことがある。UNIX系コマンドではこの処理はtail -fで実施する。

Get-Contentコマンドレットでは-Tailと-Waitを組み合わせるとこれと同じことを実現できる。tailコマンドが用意されていない環境で同じことをしたい場合に重宝する。

Get-Content -Tail -Waitでログファイルをモニタリング中

PS /Users/daichi> Get-Content /var/log/system.log -Tail 20 -Wait
Jun 13 16:48:58 MacBook-Pro-Retina-15-inch-Mid-2014 InvariantDisk[41008]: Removing symlink: /var/run/disk/by-id/media-0102D745-FC66-44D6-B0ED-D7B32AECB169
Jun 13 16:48:58 MacBook-Pro-Retina-15-inch-Mid-2014 InvariantDisk[41008]: Disk Disappeared: disk3s1
Jun 13 16:48:58 MacBook-Pro-Retina-15-inch-Mid-2014 InvariantDisk[41008]: Removing symlink: /var/run/disk/by-id/volume-0E239BC6-F960-3107-89CF-1C97F78BB46B
Jun 13 16:48:58 MacBook-Pro-Retina-15-inch-Mid-2014 InvariantDisk[41008]: Removing symlink: /var/run/disk/by-id/media-2E42B5D4-D1B0-4C88-BC2B-4F767FAB53A9
Jun 13 16:48:58 MacBook-Pro-Retina-15-inch-Mid-2014 com.apple.xpc.launchd[1] (com.apple.quicklook[57271]): Endpoint has been activated through legacy launch(3) APIs. Please switch to XPC or bootstrap_check_in(): com.apple.quicklook
Jun 13 16:48:59 MacBook-Pro-Retina-15-inch-Mid-2014 com.apple.xpc.launchd[1] (com.apple.quicklook): Service only ran for 0 seconds. Pushing respawn out by 1 seconds.
Jun 13 16:49:00 MacBook-Pro-Retina-15-inch-Mid-2014 com.apple.xpc.launchd[1] (com.apple.quicklook[57273]): Endpoint has been activated through legacy launch(3) APIs. Please switch to XPC or bootstrap_check_in(): com.apple.quicklook
Jun 13 16:49:00 MacBook-Pro-Retina-15-inch-Mid-2014 InvariantDisk[41008]: Disk Disappeared:
Jun 13 16:49:00 MacBook-Pro-Retina-15-inch-Mid-2014 kcm[57275]: DEPRECATED USE in libdispatch client: Setting timer interval to 0 requests a 1ns timer, did you mean FOREVER (a one-shot timer)?
Jun 13 16:49:03 MacBook-Pro-Retina-15-inch-Mid-2014 com.apple.xpc.launchd[1] (org.openzfsonosx.zed): Service only ran for 0 seconds. Pushing respawn out by 10 seconds.
Jun 13 16:49:03 MacBook-Pro-Retina-15-inch-Mid-2014 syslogd[60]: ASL Sender Statistics
Jun 13 16:49:13 MacBook-Pro-Retina-15-inch-Mid-2014 com.apple.xpc.launchd[1] (org.openzfsonosx.zed): Service only ran for 0 seconds. Pushing respawn out by 10 seconds.
Jun 13 16:49:43 --- last message repeated 2 times ---
Jun 13 16:49:43 MacBook-Pro-Retina-15-inch-Mid-2014 com.apple.xpc.launchd[1] (org.openzfsonosx.zed): Service only ran for 0 seconds. Pushing respawn out by 10 seconds.
Jun 13 16:50:13 --- last message repeated 2 times ---
Jun 13 16:50:13 MacBook-Pro-Retina-15-inch-Mid-2014 com.apple.xpc.launchd[1] (org.openzfsonosx.zed): Service only ran for 0 seconds. Pushing respawn out by 10 seconds.
Jun 13 16:50:43 --- last message repeated 2 times ---
Jun 13 16:50:43 MacBook-Pro-Retina-15-inch-Mid-2014 com.apple.xpc.launchd[1] (org.openzfsonosx.zed): Service only ran for 0 seconds. Pushing respawn out by 10 seconds.
Jun 13 16:51:13 --- last message repeated 2 times ---
Jun 13 16:51:13 MacBook-Pro-Retina-15-inch-Mid-2014 com.apple.xpc.launchd[1] (org.openzfsonosx.zed): Service only ran for 0 seconds. Pushing respawn out by 10 seconds.
Jun 13 16:51:43 --- last message repeated 2 times ---
Jun 13 16:51:43 MacBook-Pro-Retina-15-inch-Mid-2014 com.apple.xpc.launchd[1] (org.openzfsonosx.zed): Service only ran for 0 seconds. Pushing respawn out by 10 seconds.

Get-Content -Tail -Waitでは、指定したファイルに新しいデータが追加されると、最後に追加されたデータが逐次ターミナルに表示されるようになる。覚えておくと便利だ。

参考資料