PowerShellで全文検索

経緯

結構放置していたのですが久々に書きます。 今回の内容は、備忘も兼ねて勉強会で発表したよく使うPowerShellコマンドレットについて書きます。

前提

巷ではPowerShell というと非常に高度なことか、ごくごく触りの部分だけ紹介されることが多いように思います。 また極端にエンジニア向けの内容が多く、「便利なコマンドラインツール」よりも「高級なシェル」のイメージが強い(と勝手に思っている)。

そういったものではなく、「気軽に」「あちこちで」使えそうな「全文検索」をご紹介です。 PowerShellの基本であるGet-ChildItemをベースに、少しずつコマンドレットを足していきます。

まずは基本

Get-ChildItem

Get-ChildItem

画像

特にいうことがない、PowerShell 基本中の基本Get-ChildItem.

再帰でファイル・ディレクトリ表示

Get-ChildItem -Recurse

再帰でディレクトリの中も表示。

画像

ファイルだけ表示

Get-ChildItem -Recurse -File

ディレクトリの中のファイルだけ表示。

画像

ファイル名で検索対象を絞る

Get-ChildItem -Recurse -File -Filter "*.txt"

ディレクトリの中のファイルのうち、拡張子が「txt」のものだけ表示。

画像

ここらへんまでくると、普段の仕事でも使えるかな?というレベルだと思います。

文字列全文検索

今回の主題です。

Get-ChildItem -Recurse -File -Filter "*.txt" | Select-String "users"

ディレクトリの中のファイルのうち、拡張子が「txt」のものの中から、「users」という文字列が含まれているものを表示。

画像

これを使うことで、特定のディレクトリの中から文字列を含むファイルを検索することができます。 ドキュメントに限らず、exeやdllの中身も検索するので、「とにかくファイルが見つからない!」という時にとりあえず実行しておくのも吉。

検索結果は out-file コマンドレットなどで吐き出せます。

これの何がよいか

PowerShellが入っている環境ならどこでも使えます。比較的古いOSでもこのあたりのPowerShellは入っているため、「構成は弄れないが管理しなくてはならないサーバ」などで力を発揮します。

具体的には最近問題になっていた log4j を使っているファイルを探す時になどに力を発揮します。

またこのコマンドの実行中はズラズラっと表示が流れ続けるので、仕事をしている感が出ます。超便利。「全て終わるまで結果が分からない」ではなくある程度検索の進捗が分かるのもよいですね。

番外編

検索結果の前後行を確認したい

検索結果の前後の行を確認したい時に。ソースコードの検索などで使えるでしょうか。

Get-ChildItem -Recurse -File -Filter "*.md" | Select-String "インストール" -Context 1,3

ファイル全文を見たい

CUI上でファイルの全文を見たいときに。個人的にはあまり出番がないですが、2パターン。

Get-ChildItem -File -Recurse | Get-Content -Encoding "UTF8"
Get-ChildItem -Recurse -File -Filter "*.md" | Select-String "インストール" | Get-Content -Encoding "UTF8"

最後の数行を取得したい

ログファイルの検索などと合わせて。 select-string で Error などでひっかけつつ探すのが便利かと思います。

注意点として、 -Tail は古いOSだとPowerShellのバージョンが足りず実行できないことがあります。

Get-Item "lib\python2.7\idlelib\NEWS.txt" | Get-Content -Encoding "UTF8" -Tail 30