メインコンテンツへスキップ

Powershellで複数のテキストファイルから文字列を検索

·1438 文字·3 分
目次

はじめに
#

PowerShellを使って、サブフォルダを含む複数のテキスト形式のファイルから文字列を検索するには以下を実行します。

ls -R | sls [検索したい文字列]

例: 123という文字列を検索する場合

ls -R | sls "123"

実行すると、ヒットしたファイル名、何行目か、およびその行の文字列が一覧で表示されます。

test1.txt:1:No. 123
sub_folder\test2.txt:2:123456

動作を確認した環境は以下の通りです。

  • Windows 10 Home 21H1
  • PowerShell 5.1.19041.1320

以降では上記のコマンドの詳細や、より細かな検索条件を指定する場合のオプションを解説します。

コマンドの詳細
#

前出のコマンドにおいて、lsGet-ChildItem, slsSelect-Stringの省略形(エイリアス)です。すなわち、以下のように実行しても同じ結果が得られます。

Get-ChildItem -R | Select-String [検索したい文字列]

Get-ChildItemはカレントディレクトリにあるファイルを全て返すコマンドです。オプションに-Rを付けることによって、サブフォルダにあるファイルも取得できます。 取得したファイルをパイプライン|を使って、Select-Stringに渡します。 Select-Stringはファイル内のテキストを検索するコマンドです。

正規表現による検索
#

slsで検索する文字列には正規表現を使用できます(後述のワイルドカードは使用できません)。簡単な正規表現を以下に示します。

記号 説明
. 任意の1文字
* 直前の文字の0回以上の繰り返し
+ 直前の文字の1回以上の繰り返し
? 直前の文字が0回か1回
[a-z] 範囲内の1文字
[abc] いずれか1文字

正規表現の例をいくつか示します。

記述例 一致する 一致しない
l.w low, law lw
no*n nn, non, noon norman
no+n non, noon nn, norman
no?n nn, non noon, norman
[a-d]ook book, cook look

正規表現の詳細は以下のページを参考にしてください。

大文字と小文字の区別
#

デフォルトではアルファベットの大文字と小文字は区別されません。区別するには、sls-CaseSensitiveオプションを付けます。

以下の例では文字列FISHはヒットしますが、fishFishはヒットしません。

ls -R | sls FISH -CaseSensitive

日本語のエンコーディング
#

日本語を検索するときには、テキストファイルのエンコーディングに注意する必要があります。

Shift-JISでエンコーディングされているファイルを検索するときには、sls-Encoding defaultオプションを付けます。付けなかった場合は、UTF-8でエンコーディングされたファイルが検索されます。

ls -R -Filter test.txt | sls "あいうえお" -Encoding default

ファイル名で絞り込み
#

検索にヒットするファイルが多過ぎる場合は、ls-Filterオプションを使ってファイル名で絞り込みます。-Filterの後ろにファイル名を与えます。

例1:test.txtというファイルのみ検索したい場合

ls -R -Filter test.txt | sls "123"

また、-Filterではワイルドカードを使って柔軟にファイル名を指定できます(前述の正規表現は不可)。ワイルドカードの例を以下に示します。

記号 説明 記述例 一致する 一致しない
* 0文字以上の任意の文字 *low low, flow, shallow abc
? 任意の1文字 a?c abc, arc ac, abbc
[ ] 範囲内の1文字 a[a-c]c abc, acc arc, ac
[ ] いずれか1文字 a[br]c abc, arc aac, ac

例2:拡張子が.txtというファイルのみ検索したい場合

ls -R -Filter *.txt | sls "123"

参考
#

Helve
著者
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

関連記事

PowerShellのGet-ChildItem (gcm) でパスが通ったプログラムの場所を調べる
·1416 文字·3 分
PowerShellでパスが通ったプログラムの場所を表示するにはGet-Command (gcm) コマンドレットを使います(Linuxのwhich, whereコマンドに相当)。
Powershellでプロセスのメモリ使用量をロギングする
·2006 文字·5 分
PowerShellのGet-Processコマンドレットを使って、特定のプロセスのメモリ使用量を一定周期でロギングするコードを作成した。
Powershellでファイル名に連番を振ってリネームする
·2704 文字·6 分
PowerShellを使って、フォルダ内のファイルに連番を振ってリネームする方法をまとめた。
PowerShellでサブフォルダにあるファイル名を一覧表示する
··1668 文字·4 分
PowerShellでGet-ChildItemコマンドレットを使ってサブフォルダを含むファイル名を一覧表示する方法を調べた。
Windows10のPowerShellでAnaconda Pythonを使う方法
·3581 文字·8 分
Windows10のPowerShellでAnaconda Pythonを使うための手順をまとめた。
Outlook業務を効率化するショートカット20個
·819 文字·2 分
業務の効率化に役立つ、Outlookのショートカット20個をカテゴリ別にまとめました。