大量のログファイル探索
大量のログファイルから情報を調べようとすると面倒くさい。
例えば、以下のようなディレクトリ構成になっていて延々と毎日積み重なっていくものとする。
このうちの、数千行に渡る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行のファイルを作成した。
こんな感じ。目が痛くなる。まあ、それでもいちいち開いて、検索とすればできなくはない。ただ、コマンド一発でやりたいじゃないか。
ということで、コマンドを打ってみた。
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