🦖

PowerShellでもheadやtailコマンドを実現する方法

2023/10/27に公開

概要

こちらで紹介した「ファイルやフォルダーの一覧を更新日付順(降順)に並べ替えて表示する方法」を調べていた際、UNIXのheadやtailコマンドと同じように前方や後方から指定行数分を表示する方法も見つけたので別記事として投稿します。

ちなみにUNIX系だと一覧表示コマンド(ls)やテキストファイルの確認コマンド(cat)でも、
パイプライン(|)とheadやtailを組み合わせる事で実現できますが、
Windows(PowerShell)では一覧表示コマンド(Get-ChildItem)とテキストファイルの確認コマンド(Get-Content)、
それぞれで違う方法で対応する必要がありました。

それでは詳しく紹介します。

https://zenn.dev/haretokidoki/articles/1b48ced6152648

環境

PowerShellのバージョン
PS C:\Users\XXXX> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      7.3.8
PSEdition                      Core
GitCommitId                    7.3.8
OS                             Microsoft Windows 10.0.19045
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

PS C:\Users\XXXX>

ファイルやフォルダーの参照で対応する方法

前方よりカウントした指定行数分を表示する方法(ファイルやフォルダーの参照)

コピー用
Get-ChildItem | Select-Object -First "表示する行数を指定"
“Select-Object -First XXX”で可能
PS C:\Windows\Logs> Get-ChildItem | Select-Object -First 5

    Directory: C:\Windows\Logs

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2023/10/24    11:52                CBS
d----          2022/11/17    10:09                DISM
d----          2023/10/20    10:09                DPX
d---s          2023/10/18    15:35                MeasuredBoot
d----          2023/10/12     8:31                MoSetup

PS C:\Windows\Logs>

後方よりカウントした指定行数分を表示する方法(ファイルやフォルダーの参照)

コピー用
Get-ChildItem | Select-Object -Last "表示する行数を指定"
“Select-Object -Last XXX”で可能
PS C:\Windows\Logs> Get-ChildItem | Select-Object -Last 5

    Directory: C:\Windows\Logs

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2023/10/23     8:24                waasmediccapsule
d----          2022/09/21    13:30                WindowsBackup
d----          2023/10/24    11:41                WindowsUpdate
d----          2021/10/13     5:44                WinREAgent
-a---          2023/10/18    15:54         100389 StorGroupPolicy.log

PS C:\Windows\Logs>

テキスト形式のファイルで対応する方法

前方よりカウントした指定行数分を表示する方法(テキスト形式のファイル)

先頭行からカウントし指定された行数分が表示される。

コピー用
Get-Content "カレントの対象ファイル名(もしくはファイルのフルパス)" -TotalCount "表示する行数を指定"
オプション「Get-Content XXX -TotalCount XXX」
PS C:\Windows\Logs> Get-Content StorGroupPolicy.log -TotalCount 20
07/13/2022  0: 8:19.00000860:RegEnumKeyExW failed with (259)

07/13/2022  0: 8:19.00000860:GP object initialized successfully

07/13/2022  0: 8:19.00000891:Deny_All not set for all. Will query other 6 GUIDs

07/13/2022  0: 8:19.00000906:Policy for other GUID is not enabled, status:  1008

07/13/2022  0: 8:19.00000922:Policy for other GUID is not enabled, status:  1008

07/13/2022  0: 8:19.00000938:Policy for other GUID is not enabled, status:  1008

07/13/2022  0: 8:19.00000938:Policy for other GUID is not enabled, status:  1008

07/13/2022  0: 8:19.00000938:Policy for other GUID is not enabled, status:  1008

07/13/2022  0: 9:27.00000577:Deny_All not set for all. Will query other 6 GUIDs

PS C:\Windows\Logs>

後方よりカウントした指定行数分を表示する方法(テキスト形式のファイル)

最終行からカウントし指定された行数分が表示される。

パターン1:1回きりの確認方法

実行後にプロンプトが返ってくる。

コピー用
Get-Content "カレントの対象ファイル名(もしくはファイルのフルパス)" -Tail "表示する行数を指定"
オプション「Get-Content XXX -Tail XXX」
PS C:\Windows\Logs> Get-Content StorGroupPolicy.log -Tail 20
08/16/2023 23:28:26.00000966:RegEnumKeyExW failed with (259)

08/16/2023 23:28:26.00000966:GP object initialized successfully

08/16/2023 23:28:26.00000982:Deny_All not set for all. Will query other 6 GUIDs

08/16/2023 23:28:26.00000982:Policy for other GUID is not enabled, status:  2

08/16/2023 23:28:26.00000982:Policy for other GUID is not enabled, status:  2

08/16/2023 23:28:26.00000982:Policy for other GUID is not enabled, status:  2

08/16/2023 23:28:26.00000982:Policy for other GUID is not enabled, status:  2

08/16/2023 23:28:26.00000982:Policy for other GUID is not enabled, status:  2

08/16/2023 23:28:26.00000982:Policy for other GUID is not enabled, status:  2

08/16/2023 23:30:26.00000996:Deleted GP object

PS C:\Windows\Logs>
(👆 プロンプトが返ってくる)

パターン2:リアルタイム表示

実行後にプロンプトが返らずに常時監視した状態。(UNIXの“tail -f”とほぼ同じ動き)

コピー用
Get-Content "カレントの対象ファイル名(もしくはファイルのフルパス)" -Tail "表示する行数を指定" -Wait
オプション「Get-Content XXX -Tail XXX -Wait」
PS C:\Windows\Logs> Get-Content .\StorGroupPolicy.log -Tail 20 -Wait
10/18/2023  6:52: 3.00000048:RegEnumKeyExW failed with (259)

10/18/2023  6:52: 3.00000048:GP object initialized successfully

10/18/2023  6:52: 3.00000063:Deny_All not set for all. Will query other 6 GUIDs

10/18/2023  6:52: 3.00000063:Policy for other GUID is not enabled, status:  2

10/18/2023  6:52: 3.00000063:Policy for other GUID is not enabled, status:  2

10/18/2023  6:52: 3.00000063:Policy for other GUID is not enabled, status:  2

10/18/2023  6:52: 3.00000063:Policy for other GUID is not enabled, status:  2

10/18/2023  6:52: 3.00000063:Policy for other GUID is not enabled, status:  2

10/18/2023  6:52: 3.00000063:Policy for other GUID is not enabled, status:  2

10/18/2023  6:54: 3.00000068:Deleted GP object


(👆 プロンプトが返らずリアルタイム監視。"Ctrl + C"でプロンプトに戻る)

パターン3:リアルタイム&Grep検索の表示

実行後にプロンプトが返らず文字列でフィルターし常時監視した状態に。(UNIXの“tail -f XXX | grep XXX”とほぼ同じ動き)

コピー用
Get-Content "カレントの対象ファイル名(もしくはファイルのフルパス)" -Tail "表示する行数を指定" -Wait | Select-String -Pattern "検索文字列(正規表現も可能)"
オプション「Get-Content XXX -Tail XXX -Wait | Select-String -Pattern XXX」
PS C:\Windows\Logs> Get-Content .\StorGroupPolicy.log -Tail 20 -Wait | Select-String -Pattern ".*is not enabled.*"

10/18/2023  6:52: 3.00000063:Policy for other GUID is not enabled, status:  2
10/18/2023  6:52: 3.00000063:Policy for other GUID is not enabled, status:  2
10/18/2023  6:52: 3.00000063:Policy for other GUID is not enabled, status:  2
10/18/2023  6:52: 3.00000063:Policy for other GUID is not enabled, status:  2
10/18/2023  6:52: 3.00000063:Policy for other GUID is not enabled, status:  2
10/18/2023  6:52: 3.00000063:Policy for other GUID is not enabled, status:  2

(👆 プロンプトが返らず文字列フィルタ + リアルタイム監視。"Ctrl + C"でプロンプトに戻る)

参考情報

まとめ

  • ファイルやフォルダーの参照で対応する方法
    • 前方よりカウントした指定行数分を表示する方法
      Get-ChildItem | Select-Object -First "表示する行数を指定"
    • 後方よりカウントした指定行数分を表示する方法
      Get-ChildItem | Select-Object -Last "表示する行数を指定"
  • テキスト形式のファイルで対応する方法
    • 前方よりカウントした指定行数分を表示する方法
      Get-Content "カレントの対象ファイル名(もしくはファイルのフルパス)" -TotalCount "表示する行数を指定"
    • 後方よりカウントした指定行数分を表示する方法
      • パターン1:1回きりの確認方法
        Get-Content "カレントの対象ファイル名(もしくはファイルのフルパス)" -Tail "表示する行数を指定"
      • パターン2:リアルタイム表示
        Get-Content "カレントの対象ファイル名(もしくはファイルのフルパス)" -Tail "表示する行数を指定" -Wait
      • パターン3:リアルタイム&Grep検索の表示
        Get-Content "カレントの対象ファイル名(もしくはファイルのフルパス)" -Tail "表示する行数を指定" -Wait | Select-String -Pattern "検索文字列(正規表現も可能)"

関連記事

https://haretokidoki-blog.com/pasocon_powershell-startup/
https://zenn.dev/haretokidoki/articles/7e6924ff0cc960

GitHubで編集を提案

Discussion