PowerShell で行数や文字数をカウントする
Linux ではログファイルやデータの簡単なチェックを行う際に、wc (Word Count)で行数をカウントすることが多々あります。PowerShell では以下の方法で行数や文字数をカウントする事が出来ます。
- Measure-Object コマンドレットを使用する
- Count プロパティ又は Length プロパティを使用する
Measure-Object はオブジェクトの個数をカウントしたり、数値型のプロパティについて最小値や最大値、合計、平均といった値を計算することが出来るコマンドレットですが、文字列型(String 型)のオブジェクトについては行数や単語数、文字数をカウントすることが出来ます。
Measure-Object
Calculates the numeric properties of objects, and the characters, words, and lines in string objects, such as files of text.
Parameter Set: GenericMeasure
Measure-Object [[-Property] <String[]>] [-Average] [-InputObject <PSObject>] [-Maximum] [-Minimum] [-Sum] [<CommonParameters>]
Parameter Set: TextMeasure
Measure-Object [[-Property] <String[]>] [-Character] [-IgnoreWhiteSpace] [-InputObject <PSObject>] [-Line] [-Word] [<CommonParameters>]
行数をカウントする場合は、下側の構文を使用します。例えば、”C:\Windows\WindowsUpdate.log” の行数、単語数、文字数をカウントする場合は、以下を実行します。
PS C:\Users\Administrator> $log = Get-Content C:\Windows\WindowsUpdate.log PS C:\Users\Administrator> $log | Measure-Object -Line -Character -Word | Format-List Lines,Words,Characters Lines : 10548 Words : 123639 Characters : 1132103
実は、Get-Content で取得したテキスト($log)は String 型の配列です。1 行分が 1 つの String オブジェクトとなっており、行数分の要素を持つ配列として保持されます。そのため、オブジェクト数のカウントにより行数を取得することもできます。
PS C:\Users\Administrator> $log.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array PS C:\Users\Administrator> $log | Measure-Object | Format-List Count Count : 10548
同様に、配列の要素数を返すプロパティ Count や Length からも行数を取得できます。
PS C:\Users\Administrator> $log.Count 10548 PS C:\Users\Administrator> $log.Length 10548
このように、様々な方法で行数を取得する事が出来ますが、カウント対象のテキストに空行が含まれる場合は注意が必要です。Measure-Object の Line スイッチでカウントする行数には、空白行は含まれません。(カウントされません。)
PS C:\Users\Administrator> $ipc = (ipconfig) PS C:\Users\Administrator> $ipc | Measure-Object -Line -Character -Word | Format-List Lines,Words,Characters Lines : 15 Words : 121 Characters : 590 PS C:\Users\Administrator> $ipc | Measure-Object | Format-List Count Count : 23 PS C:\Users\Administrator> $ipc.Count 23 PS C:\Users\Administrator> $ipc.Length 23
ipconfig の表示(出力)をカウントしてみると、Measure-Object でカウントした Line とそれ以外の値(Measure-Object の Count や、配列の要素数としての Count、Length)が異なっています。Linux の wc コマンドとは動作が異なりますので注意が必要です。空行(空白行)を含めた値が必要な場合は、Line ではなく Count の値を使用しましょう。
ちなみに、Measure-Object を使用した場合と Count プロパティ(Length プロパティ)へアクセスした場合の実行時間を計測してみたところ、以下のようになりました。
PS C:\Users\Administrator> Measure-Command { $log | Measure-Object | Format-List Count } | Format-List TotalMilliseconds TotalMilliseconds : 194.0421 PS C:\Users\Administrator> Measure-Command { $log | Measure-Object -Line -Character -Word | Format-List Lines,Words,Characters } | Format-List TotalMilliseconds TotalMilliseconds : 160.143 PS C:\Users\Administrator> Measure-Command { $log.Count } | Format-List TotalMilliseconds TotalMilliseconds : 0.303 PS C:\Users\Administrator> Measure-Command { $log.Length } | Format-List TotalMilliseconds TotalMilliseconds : 0.2631
Measure-Object の方が明らかに遅いですが、気にするほどの差ではありませんでした。(行数やファイルサイズが増えた場合にはもう少し顕著な差が出るかもしれませんが。)むしろ、Measure-Object を使用することで計測対象が $null であっても問題が発生する可能性が低くなりますので、Measure-Object を使用した方が良いかもしれません。
[…] Operations Lab. […]
PowerShellの文字操作と基本情報のサイト一覧!if文の書き方 | まとめに!
2017/08/04 at 00:39