Grep検索使ってますか?
システム開発していると、無いと仕事にならないレベルで、必須機能です。
そもそもGrepって何?って人の為に、軽く説明するとこんな感じのモノ!
- テキストエディタ(秀丸エディタやVSCodeなど)
- 統合開発環境(EclipseやVisualStudioなど)
このようなアプリケーションには、基本的に搭載されてますね!
今回はサクラエディタの 『Grep機能の紹介』 と 『ちょっとした不満を解消するツールを紹介!』
便利な機能:Grepによる複数ファイル検索
サクラエディタを開いて『Ctrl + G』を押しましょう。
すると下のよう画面が開きます。
この中の『検索キーワード』『対象ファイルの条件』『検索対象のフォルダ』を入力します。
『検索』ボタンを押して、Grep検索終わった結果がこんな感じ。
この条件で検索した結果は、このファイルのこの行に当たりがありますねー
って感じで表示してくれます。
該当行はわかったからその周辺も見たいって場合は、その行をダブルクリックして下さい。
見つかったファイルの、その行に飛んでくれます!
更に一歩:【タグジャンプ】でGrep結果⇔該当箇所も簡単移動
ここまででも、初めて知ったときは 『便利!』 って、昔思いました…(遠い目)
ここでは更にソース追うのが、 3倍ぐらい早くなるショートカットキー を是非覚えておいてほしいです!
それがタグジャンプと呼ばれる機能!
問題点:何度も実行するのが面倒
ここまで、便利!っておすすめしましたが、僕には一つ不満があるのです。
見出しにもある通り、 何度も実行するのが、面倒くさいんですよ!
4,5回ぐらいだったら全然許容範囲なんですけどねー
システム開発という仕事柄、修正影響の調査や類似不具合の調査なんかで、10回20回とやる時があるんです。
その時は一回一回の待ち時間が苦痛で…そしてそれらをエビデンスとして残したいなんてなると…
思わず席を立って、軽く休憩しちゃいます(笑)
まぁそんな不満を解消するためにVBScriptでツールを作った次第です。
同じ悩みを抱えてる人の役に立てれば嬉しいです!
コード:Grepを並列実行&ファイル出力
'★★設定項目 開始★★
'ココは自分のパソコンのexeファイルが場所に書き換える
'フォルダ名が半角スペース入っている場合は、『""xx xx""』とする。
Const SakuraPath = "C:\""Program Files""\sakura\sakura.exe"
'★★設定項目 終了★★
Call JudgeDDFile
'ドラッグ&ドロップされたファイルの判定
Sub JudgeDDFile()
Dim objArgs , objFSO , objFiles , ddFile
Set objArgs = WScript.Arguments
Set objFSO = CreateObject("Scripting.FileSystemObject")
'ファイル数判定
Select Case objArgs.Count
Case 0
MsgBox "Grep対象をD&Dしてください"
Case 1
ddFile = WScript.Arguments(0)
Set objFiles = objFSO.GetFile(ddFile)
'ファイル拡張子判定
If objFSO.GetExtensionName(ddFile) = "txt" then
vret = MsgBox("このtxtファイル(" & objFiles.name & ")を基にGrepを実行しますか?",vbokcancel)
If vret = vbok then
'連続Grep処理
Call MultiGrep(objFiles)
Else
MsgBox "中止しました"
End If
Else
MsgBox "ドロップしたファイルは(" & objFiles.name & ")",,"txtファイルをD&Dして下さい"
End If
Set objFiles = Nothing
Case Else
MsgBox "1ファイルのみD&Dして下さい"
End Select
Set objArgs = Nothing
Set objFSO = Nothing
WScript.Quit
End Sub
'連続Grep処理
Sub MultiGrep(objFiles)
Dim fso , tso , flds , i
Dim stringNow , inputPath
rowNo = 0
Set fso = CreateObject("Scripting.FileSystemObject")
'読み取り専用で開く
Set tso = fso.OpenTextFile(objFiles, 1)
'ファイル名をユニークにする為、年月日日時取得
stringNow = GetNow
'入力ファイルと同じ階層に出力する為に、入力ファイルのパスを取得
inputPath = fso.getParentFolderName(objFiles)
'入力ファイルの行数分ループ
While tso.AtEndOfStream <> true
flds = Split(tso.ReadLine, vbTab)
rowNo = rowNo + 1
'"-GKEY【タブ】-GFILE【タブ】-GFOLDER"の形式
If UBound(flds) = 2 Then
Call RunGrepCmd(flds , inputPath , rowNo , stringNow)
End If
Wend
tso.Close
Set fso = Nothing
End Sub
'サクラエディタのGrepコマンドを実行
Sub RunGrepCmd(flds , inputPath , rowNo , stringNow)
Dim rowNo2 , grepCmd , objShell
'桁数を揃えるために行番号を2桁に揃える
If rowNo < 10 Then
rowNo2 = "0" & rowNo
Else
rowNo2 = rowNo
End If
'コマンドラインに流す為、Grepコマンドを生成
grepCmd = "cmd /c " & SakuraPath & " -GREPMODE -GKEY="""
grepCmd = grepCmd & flds(0)
grepCmd = grepCmd & """ -GFILE="""
grepCmd = grepCmd & flds(1)
grepCmd = grepCmd & """ -GFOLDER="""
grepCmd = grepCmd & flds(2)
grepCmd = grepCmd & """ -GOPT:""SRPU"" > "
grepCmd = grepCmd & inputPath & "\Grep結果" & stringNow & "_row" & rowNo2 & ".txt"
'コマンド実行
Set objShell = CreateObject("WScript.Shell")
objShell.Run grepCmd,0,false
Set objShell = Nothing
End Sub
'年月日日時を取得
Function GetNow()
Dim w_Now
Dim w_Month
Dim w_Day
'年取得
w_Now = ""
w_Now = Year(Now())
'月取得(二桁で揃える)
w_Month = Month(Now())
If w_Month < 10 Then
w_Now = w_Now & "0" & w_Month
Else
w_Now = w_Now & w_Month
End If
'日取得(二桁で揃える)
w_Day = Day(Now())
If w_Day < 10 Then
w_Now = w_Now & "0" & w_Day
Else
w_Now = w_Now & w_Day
End If
'時分秒取得
w_Now = w_Now & Right("0" & Hour(Now()) , 2)
w_Now = w_Now & Right("0" & Minute(Now()) , 2)
w_Now = w_Now & Right("0" & Second(Now()) , 2)
getNow = w_Now
End Function
これをコピペして適当なファイル名で拡張子vbsで保存して下さい。
(『xxx.vbs』こんな感じ)
もし作り方がわからなければ、この記事に詳しく書いてあるので、わからなかったら参照して!
解説
サクラエディタのexeファイルの場所を指定(4行目)
ここは使う人それぞれが、自分のパソコンにインストールしたサクラエディタの場所に書き換えて下さい!
ポイントは『""Program Files""』の部分です。
パスを指定している 途中に半角スペースがあるとうまく実行できないので、ダブルクォーテーションで囲んで上げる 必要があります。
実行した結果出力されたファイルに何も表示されていなかったら、ここの指定がうまく行ってないと思って下さい。
ファイル数判定(15~39行目)
今回はやりたいことがGrepだったので、この辺が毎回変わります。
- 検索したい文字列【GKEY】
- どんなファイルを対象とするか【GFILE】
- どこのフォルダ配下を対象とするか【GFOLDER】
そのため、入力ファイルに実行する際に作って、 ドラッグ&ドロップで起動するようにしています。
(詳しくは次の『使い方』で説明しますが、作ると言ってもすごく簡単です。)
コマンド作成と実行(86~99行目)
連続実行のキモの部分です。
サクラエディタのコマンドラインオプションで、Grepの実行と結果の保存を行います。
入力ファイルから受け取った情報を基に、コマンドを作ります。
(grepCmdというのが8行続いてる部分ですね!)
結果としてこんな感じのが出来上がります。
cmd /c C:\"Program Files"\sakura\sakura.exe -GREPMODE -GKEY="【キーワード】" -GFILE="【対象ファイル】" -GFOLDER="【対象フォルダ】" -GOPT:"SRPU" > 【入力ファイルのパス】\Grep結果【実行年月日日時】_row【入力ファイルの何行目】.txt
コレをコマンドラインと呼ばれるモノに送って、入力ファイルの行数分Grepが実行されるわけです。
objShell.Run grepCmd,0,false
このタイミングで実行されるわけですね。(98行目)
ツール作るときにVBScriptだけでやろうとせずに、こんな感じで 他のツールと連携すると楽 になったりします。
コマンドが想定通りか、msgBoxで確認したりも良くしますね!
Runメソッドは少しだけ奥が深いですが、『最低限これだけ覚えておくといいよ!』という補足情報載せておきます。
使い方
入力ファイルを作る
入力ファイルは『-GKEY【タブ】-GFILE【タブ】-GFOLDER』の形式で作って下さい。
具体的にはこんな感じ
\d{6} *.txt D:\Shortcut
ワード *.* D:\GoogleDrive
作り方はExcelなどで、A列:キーワード/B列:ファイル/C列:フォルダで3項目をザーっと設定
これをコピーして、サクラエディタなどに貼れば、上の形式になっているのでOK!
後は適当な場所に『.txt』形式で保存
入力ファイルをツールにドラッグ&ドロップ
作った入力ファイルをドラッグ&ドロップして、出てきたダイアログで『OK』押せば実行始まります。
入力ファイルと同じ場所にGrep結果が出力
VBScriptの場所でなく、入力ファイルの場所に出力するようになってます。
特徴としては
- 名前が毎回必ず変わるので、上書きされることがない
- タブが2つ無いとその行はスルーされるので、コメントを入力ファイルに書くこと可能
最後に
最後まで見ていただきありがとうございます!
これを使って見て、一瞬でも 『楽だ』 と感じてもらえたら嬉しい限りです。
ツール作成はレゴみたいな感じで、いろんな部品を拾い集めて形にしていく作業です。
思い描いていたものが完成したときは達成感があるんですよねー♪
この楽しさも含めて知ってもらえたら、より嬉しく思います!
今回使った部品について、記事書いているので良かったら見てみて下さい。
プログラミングやツール作成にチャレンジしてみたい方は、自分や友達の『この作業毎回やるの面倒くさい…』をヒヤリングしてみると、題材が見つかると思いますよ。
質問等あればコメント欄に記載お願いします。
いじょー!!