このページの本文へ

前へ 1 2 次へ

Windows Info 第342回

エクスプローラーのWindowsサーチ機能ではなく、コマンドラインからテキスト検索をする

2022年08月28日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

 Windows Terminalをログイン時に自動起動するようにして、Quakeモードにしたら、これが便利だ。「Win+Shift+@」でいつでもウィンドウが開く。また、筆者の環境では4Kモニターの横幅で開くので2分割しても十分幅がとれる。そういうこともあって、ファイルのテキスト検索をPowerShellで済ませることにした。

select-stringでコマンドラインからファイルのテキスト検索ができる

実はPowerShellでもテキスト検索ができる

 PowerShellでファイルのテキスト検索をするには、「select-string」コマンドを使う。基本的なコマンドの書式は、

select-string [-Pattern]〈REGX〉 [-Path] 〈PATH〉

である。なお、標準で「select-string」にはエイリアスが設定されていて「sls」と略記できる。「-Pattern」「-Path」オプションも省略可能なので、

sls '検索' *.txt

とできる。

 注意が必要なのは、標準では検索は行単位なので、複数行がヒットした場合には複数表示が出ることだ。長いテキストファイルの中で特定のキーワードを含む行だけを見たいといった場合には便利だが、テキスト検索では多数のファイルから特定のキーワードを含むファイルを探すこともある。その場合には、「-List」オプションを指定することで、2つ目以降のヒット行の出力を省略できる。

 ファイルの文字エンコードを指定することもできる。指定が可能なのは「ascii」「bigendianunicode」「default」「oem」「unicode」「utf7」「utf8」「uft32」の8つだけ。また、このエンコードで対象ファイルを特定することはできない。

 PowerShellでは、BOMで判断が可能なテキストエンコーディングには自動で対応するため、UTF-8~UTF-32までBOM付きならばエンコードの指示に関係なくファイルを検索する。しかし、エンコード指定が必須の場合がある。それはシフトJISでの検索である。Windowsの日本語版では、これは「oem」として指定する。

 ただし、oemを指定した場合は、BOMなしのUTF-8でエンコードされたファイルが検索できない。select-stringコマンドは、-Encodeオプションは1つしか指定できないためだ。結局、シフトJISとBOMなしUTF-8の検索は背反でどちらか一方のみできる。もっともデフォルトでシフトJISが優先になるエクスプローラーの検索機能よりはマシだろう。

 もっともこのあたりは、個人の状況による。筆者は最近はテキストファイルをすべてBOMなしUTF-8にしているので、-Encodeオプションをつけないで検索している。シフトJISのファイルも探したい場合に限り、ヒストリ機能で直前のコマンドを呼びだし、「-Encode oem」を指定して実行させている。

 PATHには、フォルダー名を含むワイルドカードを使ったパスが指定できる。たとえば、「*\*.txt」とすれば、サブフォルダーにある「*.txt」ファイルを検索対象にできる。注意するのは、このパターンでは必ずパス区切りが一致するため、カレントフォルダーは検索対象にならない点だ。サブフォルダーを含めて検索するような場合、後述するGet-ChildItemと組み合わせる必要がある。基本的には、select-stringは、そのままではサブフォルダーを含めての検索には使えないと思った方がよい。

 コマンドの出力は、何もしなければ「ファイル名:行番号:該当行」となるが、パターンが見つかった行をそのまま表示してしまうため、行が長いと出力が面倒なことになり、結果が見づらくなる。ファイルのフルパスだけ、あるいはファイル名だけ表示できればよいことも多い。そういう場合、

sls 'IPアドレス' *.txt -Encoding oem -List | Select-Object Path
sls 'IP Address' *.txt -Encoding oem -List | Select-Object filename

などとして、表示したいプロパティのみをselect-Objectコマンドで取り出せばよい。なお、select-objectコマンドには、「select」というエイリアスが定義されている。

 select-stringコマンドはMatchInfoオブジェクトを出力している。オブジェクトのプロパティなどは、Get-Memberコマンド(エイリアスはgm)で調べることができる。

 コマンドの詳細な解説は、Microsoftのサイトにある。

●Select-String (Microsoft.PowerShell.Utility)
 https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/select-string?view=powershell-5.1&WT.mc_id=ps-geth

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン