PowerShellでログ探索するにはSelect-Stringで気合を入れる

大量のログファイル探索

大量のログファイルから情報を調べようとすると面倒くさい。
例えば、以下のようなディレクトリ構成になっていて延々と毎日積み重なっていくものとする。

Image from Gyazo

このうちの、数千行に渡るA.logの中から"Start"と"End"の行の入ったログを調べるという作業をしたとする。実際の業務では、もう少し多数のパターンで調べているので更に頭を悩ませているのだが...。

Linuxであれば、grepやawkなどでテキスト探索や加工などできるが、Windowsの場合だとどうするか、というところ。

PowerShellでやってしまおうじゃないか、なあ?

Select-String

PowerShellでテキスト探索をしようとする場合には、Select-String コマンドレットを使うのが容易い。

仮に、root中にある日付ファイルからServerXとServerYの双方のディレクトリにあるA.logの中にある、「start」から始まる行と「end」から始まる行を抽出したいとする。

Set-Location C:\root
Select-String -Pattern "(^start .*$|^end .*$)" -Path .\20200624\Server[XY]\A.log

実行結果

では、実際に試してみる。適当なランダムファイルに意図的に、start行とend行を加えたテキストファイルを作成。なお、一つのファイルには8000行のファイルを作成した。

Image from Gyazo

こんな感じ。目が痛くなる。まあ、それでもいちいち開いて、検索とすればできなくはない。ただ、コマンド一発でやりたいじゃないか。

ということで、コマンドを打ってみた。

PS C:\root> Select-String -Pattern "(^start .*$|^end .*$)" -Path .\20200624\Server[XY]\A.log

20200624\ServerX\A.log:116:start tjl7LG#[xz%>y4t2x6E0Fg>uyg(|&l#Y6RF%C:wdH&tXuSXT8}sLg%khqwiDpQ0XBkMBvv|Lqpt(z.(2^(Hvd5>1EUY0r%wfPB
20200624\ServerX\A.log:6100:end cRdEjo]a*eN7Xgxr@y5a}t|DG*dtmySBw4PbJraH/p5Uhn#_gfnrB9G%BQbk8u/k40AD(]GCiW^urCob+7yFin)S%pWV1]ba;yA 
:fz+u*mDC|*4fK1J@m2vhEf7z
20200624\ServerY\A.log:116:start tjl7LG#[xz%>y4t2x6E0Fg>uyg(|&l#Y6RF%C:wdH&tXuSXT8}sLg%khqwiDpQ0XBkMBvv|Lqpt(z.(2^(Hvd5>1EUY0r%wfPB 
-F2quC+P1kZv7$7[jq;08$_7
20200624\ServerY\A.log:6100:end cRdEjo]a*eN7Xgxr@y5a}t|DG*dtmySBw4PbJraH/p5Uhn#_gfnrB9G%BQbk8u/k40AD(]GCiW^urCob+7yFin)S%pWV1]ba;yA 
:fz+u*mDC|*4fK1J@m2vhEf7z

このように、ファイルパス:行数:文字列といった表示がされる。

実行時間

実行時間は、約0.66秒であった。

PS C:\root> Measure-Command {  Select-String -Pattern "(^start .*$|^end .*$)" -Path .\20200624\Server[XY]\A.log }

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 66
Ticks             : 660679
TotalDays         : 7.64674768518519E-07
TotalHours        : 1.83521944444444E-05
TotalMinutes      : 0.00110113166666667
TotalSeconds      : 0.0660679
TotalMilliseconds : 66.0679

応用など

8000行をわざわざ目を通すよりも遥かに楽なのは言うまでもない。応用して、その月のすべてのServerXのB.logのstartとendを調べるなどもできる。サーバー内のディレクトリ構成さえ決まっているならばいろいろな探索ができるだろう。

Set-Location C:\root
Select-String -Pattern "(^start .*$|^end .*$)" -Path .\202006..\ServerX\B.log

文末

感想・コメントなど書いていただけると嬉しいです

twitter ねこ (@gat3ta) / Twitter

コメント

このブログの人気の投稿

リモートワークをLogicoolのマウスとキーボードで複数PC切り替えて優勝した

VBAでのInterfaceやキャスト

SUPERHOTがいかにSUPERHOTか語りたい