Operations Lab.

PowerShell で行数や文字数をカウントする

with one comment

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 を使用した方が良いかもしれません。

Written by kazu

2013/03/12 @ 07:45

カテゴリー: PowerShell

Tagged with ,

1件のフィードバック

Subscribe to comments with RSS.


コメントを残す