Windows コマンド プロンプトから検索する

FINDコマンド

Windowsのコマンドプロンプトやバッチファイルから複数のファイル内のテキストを検索するためには、FINDコマンドを使用できます。これはMS-DOSの時代から存在し、現在でもWindows 11で利用可能です。Unixのgrepコマンドに似ていますが、正規表現をサポートしていません。現在のディレクトリ内でborogovesという単語を検索するには、以下の構文を使用してください:

find "borogoves" *

パターンを囲む二重引用符は必須です。PowerShellを使用している場合は、さらにシングル引用符も含める必要があります:

find '"borogoves"' *

アスタリスク(*)の代わりに、*.htm?のようなファイルマスクを指定することもできます。findコマンドは、ファイル内に一致がない場合でも、スキャンしたファイル名を表示します:

検索は大文字小文字を区別するデフォルトですので、通常は/Iスイッチを追加して、大文字と小文字を同等に扱う必要があります:

find /I "<a href=" *.htm

検索するファイルを指定しない場合、findは別のコマンドの出力からテキスト入力をstdinから待機します。例えば、Windowsでサポートされているすべてのコピーコマンドをリストすることができます:

help | find /i "copy"

別のスイッチ/Vを使用すると、パターンを含まないすべての行を検索できます。これはgrep -vコマンドに似ています。

バッチファイルでは、findコマンドがパターンが見つからない場合にエラーコード(errorlevel)を1に設定するという事実を利用できます。例えば、マシンが64ビットまたは32ビットのWindowsバージョンを実行しているかを確認できます。

@echo off 
rem Based on KB556009 with some corrections reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" /v "Identifier" | find /i "x86 Family" > nul if errorlevel 1 goto win64 
echo 32-bit Windows goto :eof 
:win64 rem Could be AMD64 or ARM64 echo 64-bit Windows

FINDSTRコマンド:正規表現検索

正規表現を探す必要がある場合は、Windows XPで導入されたFINDSTRコマンドを試してみてください。歴史的な理由から、findstrは正規表現の限定されたサブセットをサポートしているため、これらの正規表現機能のみを使用できます:

  • ドット.は改行や拡張ASCII文字を除く任意の文字と一致します。
  • 文字リスト[abc]は指定された文字(ab、またはc)のいずれかと一致します。
  • 文字リストの範囲[a-z]aからzまでの任意の文字と一致します。
  • アスタリスク(*)は、前の文字が0回以上繰り返されることを示します。
  • \<および\>記号は、単語の始まりと終わりを示します。
  • キャレット(^)とドル記号($)は、行の始まりと終わりを示します。
  • バックスラッシュ(\)は、メタ文字をエスケープし、文字通りの文字を検索できるようにします。例えば、\$はドル記号自体を検索します。

Findstrは文字クラス(\d)、選択(|)、または他の繰り返し(+または{5})をサポートしていません。

基本的な構文はFINDコマンドと同じです:

findstr "\<20[0-9][0-9]\>" *.htm

このコマンドは、現在のディレクトリの.htmファイル内で2000から始まるすべての年を検索します。findと同様に、/Iスイッチを使用して大文字小文字を区別しない検索を行います:

FINDSTRの制限と癖

文字リスト[a-z]は常に大文字小文字を区別しないため、echo ABC | findstr "[a-z]"は一致します。

スペース文字findstrでは選言メタ文字として機能するため、findstr "new shoes" *のような検索クエリは、newまたはshoesを含むすべての行を検索します。残念ながら、スペースをエスケープして正規表現で文字通りに使用する方法はありません。例えば、スペースで始まる行を検索することはできません。

正規表現の構文エラーは無視されます。例えば、findstr "[" *[文字を含むすべての行に一致します。

ファイルにUnixの改行(LF)が含まれている場合、$メタ文字は正しく機能しません。ファイルの最後の行に行の終端子がない場合、findstrはそれを見つけることができません。例えば、</html>の後にCR+LFがない場合、findstr "</html>$" *は機能しません。

初期のWindowsバージョンでは、findfindstr などのコマンドに対して行の長さの制限がありました。しかし、最近のバージョンではこれらの制限が撤廃されたため、その点を心配する必要はありません。findstrの制限やバグ、特に初期のWindowsバージョンにおけるものについては、このStackOverflowの質問を参照してください。

findstrコマンドはOEM(MS-DOS)コードページで動作します。ドットメタ文字は、拡張ASCII文字のいずれとも一致しません。その結果、非英語のテキストに対してはあまり役立ちません。また、Unicode文字(UTF-8またはUTF-16)を検索することもできません。

結論

findstr /?find /? を入力することで、他のスイッチについて学ぶことができます。例えば、追加のスイッチを使用すると、サブディレクトリ内を検索したり、行番号を出力したりできます。公式ドキュメントも参照してください。

一般的に、findfindstr コマンドは古くなっており、さまざまな奇妙な挙動や制限があります。

Source:
https://dzone.com/articles/search-from-the-windows-command-prompt