Windows Terminalをログイン時に自動起動するようにして、Quakeモードにしたら、これが便利だ。「Win+Shift+@」でいつでもウィンドウが開く。また、筆者の環境では4Kモニターの横幅で開くので2分割しても十分幅がとれる。そういうこともあって、ファイルのテキスト検索をPowerShellで済ませることにした。
実は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
この連載の記事
-
第458回
PC
Windows上でhostsファイルを活用する -
第457回
PC
IPv6アドレスは先頭を見ればどんな種類かわかる -
第456回
PC
あらためてIPv6基本のキ -
第455回
PC
Windowsで現在どのネットワークアダプタがインターネット接続に使われているかを調べる方法 -
第454回
PC
Windows 11 24H2では「デバイスの暗号化」の条件が変わり、より多くのPCでドライブが暗号化される -
第453回
PC
Windows 11 24H2の配布開始後もすぐにはやってこない Windows UpdateとSafeguard Holds -
第452回
PC
Windows 11 Ver.24H2が登場 Copilot+ PCとそうでないPCで実質Windowsが2つに分かれる -
第451回
PC
新しいWindowsサンドボックスではコマンドラインからの制御が可能に -
第450回
PC
ユニコードで文字数を数える方法 -
第449回
PC
WSLはプレビュー版でGUIでの設定が加わった! リリース2.3.xの新機能を見る -
第448回
PC
PowerShellで面倒なオブジェクトはPSCustomObjectに変換するのが早道 - この連載の一覧へ