前回に続いて文字数をカウントするコマンドです。前回はUNIX系でしたが、今回はPowerShellを使います。PowerShellと言えばWindowsがメインですが、PowerShell Core登場以降はLinuxやmacOSでも動作します。と言っても完全に同じように動作するわけではありません。今回のような文字数をカウントするといった簡単なものであればWindows PowerShellでもPowerShell Coreでも同じように動作します。今回はPowerShell Coreをベースとして説明していきます。
macOS/LinuxでPowerShellをインストールしてみたいという人は以下のマイクロソフトの公式ページを参照してみてください。

https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell?view=powershell-7.2

今回もこれまでのようにサンプルで利用するファイル・ディレクトリはデスクトップのsampleディレクトリとしています。デスクトップにsampleディレクトリがない場合は作成しておいてください(コマンド入力ならmkdir ~/Desktop/sampleとして作成することができます)。
また、カレントディレクトリも上記の場所になります。cd ~/Desktop/sampleのようにコマンドを入力してカレントディレクトリを変更しておけばよいでしょう。

PowerShellで行数カウント

 今度はPowerShellで行数をカウントしてみましょう。PowerShellの場合はいくつか方法があります。まず、ファイル(オブジェクト)に対してLengthプロパティを使う方法です。
 カレントディレクトリにある1.txtの行数を表示するには以下のように指定します。

(Get-Content 1.txt).Length

ちなみにGet-Contentはエイリアスとしてcatが設定されているので以下のようにしても同じ結果になります。

(cat 1.txt).Length

PowerShellにはLengthプロパティ以外にCountプロパティもあります。以下のようにしても行数が出力されます。空白行もカウントされます。後述するMeasure-Objectの場合、空白行をカウントしないのでLength,Countを使った場合と結果が異なる場合がある点には注意が必要です。

(Get-Content 1.txt). Count

 Measure-Objectの説明は次に行うとして実際の実行結果を確認してみましょう。なお、比較するテキストファイルの内容は以下のようになっています。

 実際にMeasure-Objectを使った行数カウントは以下のようになります。Measure-Objectでは複数の空行はまとめられて1行としてカウントされているのがわかります。

Get-Content ./1.txt | Measure-Object -Line
Get-Content ./1n.txt | Measure-Object -Line

より詳細に文字数などを調べる

 Length、Countでは行数しか求めることができません。文字数・単語数なども求めたい場合にはMeasure-Objectを使います(すでに使ってしまいましたが)。これがUNIX系でのwcに該当するようなものだと思ってよいでしょう。
 PowerShellでは、Measure-Objectを使うことでUNIX系のwcと似たような結果を求める事ができます。
 まず、先ほどと同様に指定したファイルの行数を求めてみます。この場合、Measure-Objectのオプションに-Lineを指定します。
 以下のようにすると1.txtファイルの行数が表示されます。

Get-Content ./1.txt | Measure-Object -Line

 文字数を求めたい場合はオプションに-Characterを指定します。

Get-Content ./1.txt | Measure-Object -Character 

 単語の数であれば-Wordを指定します。

Get-Content ./1.txt | Measure-Object -Word

Measure-Objectのエイリアスを作成する

 UNIX系ならwcと2文字入力すれば簡単に文字数カウントができますが、PowerShellだと補完機能があるにせよMeasure-Objectと入力するのは面倒です。そこでMeasure-Objectのエイリアスを作成して短い文字数にしてしまいましょう。ただし、macOS/Linuxなどではwcコマンドが存在するためエイリアスのwcの2文字は避けたいところです。

 仕方ないので3文字のエイリアス名にすることにしましょう。とりあえずwwcという名前のエイリアスを作成します。と、その前にGet-Aliasでエイリアス一覧を表示してwwcという名前のエイリアスが存在しないことを確認しておきましょう。

Get-Alias

たくさんエイリアスが設定されているとwwcの文字を見つけるのが面倒です。そんな時にはUNIXのgrepのような文字列検索を行うSelect-Stringを使うと便利です。以下のようにするとwwcに部分一致するエイリアスをピックアップしてくれます。wwcのエイリアスは設定されていないので何も表示されません。

Get-Alias|Select-String -SimpleMatch 'wwc'

せっかくなのでwを含むエイリアスを表示してみましょう。以下のように入力します。

Get-Alias|Select-String -SimpleMatch 'w'

さて、wwcという名前のエイリアスは存在しないことを確認したので今度はエイリアスを作成してみましょう。以下のように入力するとMeasure-Objectのエイリアスとしてwwcが作成されます。

Set-Alias -Name wwc -Value Measure-Object

入力したらGet-Aliasと入力してwwcのエイリアスが設定されたか確認してみましょう。wwc -> Measure-Objectという文字列があれば大丈夫です。

Get-Alias

間違えてエイリアスを設定してしまった場合はRemove-Aliasを使って削除してください。削除できたかどうかはGet-Aliasで確認しておきましょう。

Remove-Alias wwc

Remove-AliasはPowerShell 6.0以降で使用可能なコマンド(コマンドレット)なので、古いWindowsマシン上で動かさないといけない場合にはRemove-item alias:wwcとすればエイリアスを削除できます。

それでは早速設定したエイリアスを使って行数を表示してみましょう。以下のようにすると1.txtファイルの行数が表示されます。

Get-Content ./1.txt | wwc -Line

文字数なら以下のようになります。短い名前なので入力ミスも軽減できます。

Get-Content ./1.txt | wwc -Character 

PowerShellのコマンド名(コマンドレット)は長いので使いやすくするにはエイリアスを設定した方がよいかもしれません。もっとも、PowerShellではUNIXのシェルと同じような機能のコマンドに関してはたくさんのエイリアスが設定されているので、PowerShellの開発者も長いコマンド名は不便だなと思っていたのかもしれません。特に緊急時に長いコマンド名を入力するのは、やはり手間がかかりあまりよろしくない感じはあります。

それでは、また次回。

著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。