LoginSignup
1
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-06-23

大量のログファイル探索

大量のログファイルから情報を調べようとすると面倒くさい。

例えば、以下のようなディレクトリ構成になっていて延々と毎日積み重なっていくものとする。

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0