Windowsでgrep検索!PowerShell・cmdを使ってファイル内の文字列を横断検索する方法を解説

Windowsでgrepする方法

「Linuxではすぐにgrepできるのに、Windowsでは何を打てばよいのだろう」と戸惑っていませんか。
Windowsでも、標準のコマンドプロンプトとPowerShellだけで、コマンド出力の絞り込み、名前に特定の文字列を含むファイルやフォルダーの探索、ファイル内容の横断検索を実現できます。
この記事では、WindowsでGrepする方法を用途別に整理し、短く書ける別名中心のコマンドと、その正式なコマンド名やオプションの意味まで解説します。
GitやWSLを追加しなくても、作業中のWindows環境で必要な情報をすばやく見つけられるようになります。

目次

まずは結論から

WindowsにはLinuxのgrepコマンドが最初から入っているわけではありません。
ただし、コマンドプロンプトではfindstr、PowerShellではSelect-Stringを使うことで、grepとほぼ同じ目的の文字列検索ができます。

用途ごとに使い分けると、迷いません。

  • コマンドの表示結果から必要な行を抜き出したい場合は、cmdならfindstr、PowerShellならoss | slsを使います。
  • ファイル名やフォルダー名に含まれる文字列を探したい場合は、cmdならdir、PowerShellならgciを使います。
  • 複数ファイルの中身まで検索したい場合は、PowerShellのgci -File -r | slsが便利です。

Windows標準の検索コマンドは、Linuxのgrepと完全に同一ではありません。
それでも、日常的なログ確認や設定ファイルの探索なら、十分に役立ちます。
以降では、コピーして試せる形で順番に確認しましょう。

Windows標準コマンドによるGrep相当機能

最初に押さえたいのは、検索対象によってコマンドが変わる点です。
画面に表示された文字列を探すのか、ファイル名を探すのか、ファイル本文を探すのかで、最適な書き方は異なります。

検索したい対象 コマンドプロンプト PowerShell 向いている場面
コマンド出力 findstr oss | sls ipconfigtasklistの結果を絞る場面
ファイル名とフォルダー名 dir gci 名前の一部だけ覚えている場面
ファイルの本文 findstrでも可能 gci -File -r | sls ソースコードやログ内の設定値を探す場面

PowerShellのgcislsのような短い表記は、正式なコマンド名の別名です。
別名はコマンド名を短くする仕組みであり、同じ処理をより少ない入力で実行できます。

一方で、PowerShellはコマンド間で文字列だけでなく、ファイル情報などのオブジェクトも渡します。
この違いを意識すると、Linuxのパイプ操作に近い感覚でWindowsの検索を使いこなせます。

コマンド出力を検索するcmdのfindstr

コマンドプロンプトで、あるコマンドの実行結果から特定の文字列を含む行だけを確認したい場合は、findstrを使います。
たとえばネットワーク情報を確認するとき、長い表示からIPv4だけを見つけたい場面に便利です。

{COMMAND} | findstr /n {TARGET_TEXT}

{COMMAND}を実行したいコマンドに、{TARGET_TEXT}を探したい文字列に置き換えてください。
findstrは一致した行を表示でき、/nを付けると行番号も確認できます。

  • findstrはcmdに標準搭載されている文字列検索コマンドです。PowerShellの別名ではありません。
  • /nは一致した行の先頭に行番号を表示するオプションです。
  • |は左側のコマンド出力を右側のfindstrへ渡すパイプです。
  • {COMMAND}は、たとえばipconfigtasklistなど、検索したい結果を出すコマンドを表す置換用の記号です。
  • {TARGET_TEXT}は検索文字列です。findstrは既定で正規表現として解釈するため、記号を含む文字列では注意が必要です。

たとえば次の形なら、ipconfigの出力にあるIPv4を含む行だけを取り出せます。

ipconfig | findstr /n IPv4

検索語の大文字と小文字を区別したくない場合は、/iを追加します。
空白を含む語句を一まとまりで探す場合は、/c:"検索語句"を使うと意図しない分割を防げます。
ただし、findstrの正規表現はGNU grepと完全に同じではありません。複雑な正規表現を移植するときは、結果を必ず確認してください。

コマンド出力を検索するPowerShellのossとsls

PowerShellで画面上の出力をgrepのように絞り込むなら、次の短い書き方を使えます。
PowerShellのコマンドはファイル情報やプロセス情報をオブジェクトとして扱うため、表示形式を文字列にしてから検索するのがポイントです。

{COMMAND} | oss | sls {TARGET_TEXT}

この形は、表形式で表示される結果を検索したいときに特に有効です。
たとえばGet-Process | oss | sls notepadなら、プロセス一覧の表示からnotepadを含む行を探せます。

  • ossOut-String -Streamを呼び出すPowerShellの短縮関数です。表示結果を1行ずつ文字列に変換します。
  • Out-Stringは、PowerShellのオブジェクトを画面に見える形の文字列へ変換する正式コマンドです。
  • -Streamは、全体を1つの長い文字列にせず、行ごとの文字列として出力するオプションです。
  • slsSelect-Stringの別名です。文字列やファイルの中からパターンに一致する部分を検索します。
  • Select-Stringは既定で正規表現を使います。単なる文字列として検索したい場合は、正式名でSelect-String -SimpleMatchを使います。
  • |は左の結果を右のコマンドへ渡すパイプです。PowerShellではオブジェクトが順に渡されます。
  • {COMMAND}{TARGET_TEXT}は、それぞれ実行コマンドと検索文字列に置き換えます。

ossは別名ではなく、Out-String -Streamを簡潔に書くためにPowerShellが用意している関数です。
一方、slsは別名です。現在の環境で短縮表記の対応先を確認したいときは、Get-Command ossGet-Alias slsを実行します。
長い表の一部が省略される場合は、Out-String -Width 200 -Streamのように正式名で幅を広げる方法もあります。

名前に特定の文字列を含む項目を探すcmdのdir

ファイルやフォルダーの名前にtestを含む項目を、現在のフォルダー以下から探すなら、cmdでは次のコマンドを使います。
*test**は、前後にどのような文字列があってもよいという意味です。

dir /s /d *test*
  • dirは、ファイルとフォルダーの一覧を表示するcmdの標準コマンドです。
  • /sは、現在のフォルダーだけでなく、すべてのサブフォルダーも再帰的に検索するオプションです。
  • /dは、結果を横方向の一覧形式で表示するオプションです。検索対象をディレクトリだけに絞る指定ではありません。
  • *test*は、名前のどこかにtestを含むファイルまたはフォルダーを表すワイルドカード指定です。

特定の場所から検索したい場合は、検索開始フォルダーをパスで指定します。
パスに空白が入る可能性があるため、半角のダブルクォートで囲む書き方を覚えておくと安全です。

dir /s /d "C:\testdir\*test*"
  • "C:\testdir\*test*"は、C:\testdir以下を検索開始位置にして、名前にtestを含む項目を探す指定です。
  • "はcmdでパスをひとまとまりの引数として扱うための半角ダブルクォートです。記事やチャットからコピーする際は、のような装飾引用符ではなく、キーボードで入力できる"を使います。
  • /s/dの意味は、前のコマンドと同じです。
  • *test**は、名前の先頭側と末尾側にある任意の文字列に一致します。

dir /s /dは結果が横に並ぶため、件数が多いとパスを読み取りにくい場合があります。
フルパスを1行ずつ確認したい場面では、次に紹介するPowerShellの書き方のほうが見やすくなります。
また、Windowsのdirで使うワイルドカードは短いファイル名との対応により、まれに想定外の一致を返す場合があるため、重要な操作前には対象を目視確認してください。

名前に特定の文字列を含む項目を探すPowerShellのgci

PowerShellでは、gciで項目を列挙し、% FullNameでフルパスだけを出力できます。
結果を1行ずつ確認できるため、フォルダー階層が深い開発環境でも扱いやすい書き方です。

gci *test* -r | % FullName
  • gciGet-ChildItemの別名です。ファイルやフォルダーなど、指定場所の子項目を取得します。
  • *test*はワイルドカードです。testを名前の一部に含む項目に一致します。*は0文字以上の任意の文字に一致します。
  • -r-Recurseの短縮指定です。配下のサブフォルダーまで再帰的に対象を取得します。
  • %ForEach-Objectの別名です。パイプから渡された項目を1つずつ処理します。
  • FullNameは、各項目のフルパスを取り出すプロパティ名です。ForEach-Objectの省略構文により、% FullNameだけで指定できます。
  • |は、gciで見つけた項目を%へ渡すパイプです。

PowerShellのgciは、ファイルシステムだけでなくレジストリなども扱えるコマンドです。
今回のようにファイルとフォルダーを探す目的では、通常のファイルシステムの場所で実行してください。
特定のフォルダーを開始位置にしたい場合は、gci "C:\testdir\*test*" -r | % FullNameのように、先頭の検索パターンへパスを加えます。

ファイル本文を横断検索するPowerShellのgciとsls

複数のファイルを対象に、本文にtestという文字列を含むファイルや行を探すなら、次のコマンドを使います。
ファイル名ではなく、中に書かれている設定値やログメッセージを探す場面に向いています。

gci -File -r | sls test
  • gciGet-ChildItemの別名です。検索対象となるファイル情報を取得します。
  • -Fileは、取得対象をファイルだけに限定するオプションです。フォルダーを検索対象から外します。
  • -r-Recurseの短縮指定です。現在のフォルダー以下を再帰的に探索します。
  • slsSelect-Stringの別名です。パイプで渡されたファイルの内容から、指定したパターンを検索します。
  • testは検索する文字列です。Select-Stringは既定で正規表現として解釈します。
  • |は、列挙したファイルをSelect-Stringへ渡すパイプです。

このコマンドの出力には、通常はファイル名、行番号、一致した行が表示されます。
Select-Stringはテキスト行を基準に検索するため、どのファイルのどの場所に記述があるかを確認しやすいのが特徴です。
ソースコード内で設定名を探す作業は、紙の束から見出し語を探すのではなく、付箋の付いたページだけを即座に開くようなイメージです。

WindowsでGrepする方法におけるPowerShellのファイル本文検索フロー

検索範囲が広いと、アクセス権がないフォルダーでエラーが表示されることがあります。
これは検索コマンドの故障ではなく、PowerShellを実行しているアカウントに対象フォルダーを読む権限がないことが主な原因です。
まずはプロジェクトフォルダーなど、検索対象を明示した場所から実行すると、安全かつ高速に調べられます。

検索精度を上げるための使い分け

文字列検索で迷いやすいのが、ファイル名のワイルドカードと、本文検索の正規表現の違いです。
*test*は名前の候補を広く拾うためのワイルドカードです。
一方、sls testfindstr testは、行の中にある文字列パターンを探すための検索です。

やりたいこと 覚えておく指定 注意点
大文字と小文字を区別せずにcmdで検索 findstr /i PowerShellのSelect-Stringは既定で大文字小文字を区別しません。
文字列を正規表現として扱いたくない Select-String -SimpleMatch .*などを文字そのものとして探しやすくなります。
特定の拡張子だけを本文検索 gci *.log -File -r | sls test ログや設定ファイルだけに絞ると速くなります。
前後の行も確認 Select-String -Context 2,2 正式コマンド名で指定すると、前後2行ずつ表示できます。

業務でよくある失敗は、ドライブ全体をいきなり再帰検索することです。
C:\全体を対象にすると時間がかかるだけでなく、権限エラーも混ざり、必要な結果を見つけにくくなります。
まずは対象プロジェクト、ログ保存先、作業フォルダーの順に範囲を絞ると、検索結果を確認しやすくなります。

LinuxのgrepとWindows検索の違い

Linuxに慣れていると、Windowsでgrepと入力しても見つからず、作業が止まったように感じるかもしれません。
しかしWindows標準環境では、文字列検索の担当がcmdのfindstrとPowerShellのSelect-Stringに分かれていると考えると理解しやすくなります。

findstrは、昔からあるコマンドプロンプトで短く結果を絞るのに向いています。
Select-Stringは、ファイル情報を扱うGet-ChildItemと組み合わせられるため、複数ファイルの本文検索に強みがあります。

PowerShellの短縮表記は対話操作では便利ですが、チームで共有するスクリプトでは正式名を使う選択肢もあります。
読む人がgcislsに不慣れでも、Get-ChildItemSelect-Stringなら目的を推測しやすいためです。
個人の調査では短縮表記、手順書や運用スクリプトでは正式名という使い分けが実務的です。

よくある質問

  • cmdのfindstrで日本語を検索できますか 可能です。ただし、対象ファイルの文字コードやコンソールの文字コードによって表示や一致結果が変わる場合があります。まずは小さな対象ファイルで結果を確認してください。
  • PowerShellのslsはgrepと同じですか 完全に同じではありません。slsSelect-Stringの別名で、正規表現検索や行番号表示など、grepに近い用途を担います。
  • gci -File -r | sls testが遅いときはどうすればよいですか 検索開始フォルダーを指定し、*.log*.txtのように拡張子で対象を絞ってください。再帰検索の件数を減らせます。
  • 短縮表記が動くか確認する方法はありますか Get-Alias slsで別名を確認できます。ossは関数なので、Get-Command ossで確認します。

まとめ

Windowsでも、追加ソフトを入れずにgrepとほぼ同じ目的の検索はできます。
コマンドプロンプトとPowerShellの得意分野を分けて覚えると、開発作業や障害調査で探す時間を減らせます。

  • cmdのコマンド出力検索には、{COMMAND} | findstr /n {TARGET_TEXT}を使います。
  • PowerShellのコマンド出力検索には、{COMMAND} | oss | sls {TARGET_TEXT}を使います。
  • ファイル名とフォルダー名の検索には、cmdのdir /s /d *test*、またはPowerShellのgci *test* -r | % FullNameを使います。
  • ファイル本文の横断検索には、gci -File -r | sls testを使います。
  • gcisls%はPowerShellの別名であり、正式名を知っておくと応用しやすくなります。

まずは作業フォルダー内で、ファイル名検索と本文検索を1回ずつ試してみてください。
自分の用途に合う形を覚えると、Windowsでの調査作業がぐっと楽になります。

  • URLをコピーしました!
目次