JavaScriptを有効にしてください

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

 ·   3 min read

※記事内に商品プロモーションを含むことがあります。

はじめに

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

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

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

1
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の省略形(エイリアス)です。すなわち、以下のように実行しても同じ結果が得られます。

1
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はヒットしません。

1
ls -R | sls FISH -CaseSensitive

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

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

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

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

ファイル名で絞り込み

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

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

1
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というファイルのみ検索したい場合

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

参考

シェアする

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

サイト内検索