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]
は指定された文字(a
、b
、または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バージョンでは、find
や findstr
などのコマンドに対して行の長さの制限がありました。しかし、最近のバージョンではこれらの制限が撤廃されたため、その点を心配する必要はありません。findstr
の制限やバグ、特に初期のWindowsバージョンにおけるものについては、このStackOverflowの質問を参照してください。
findstrコマンドはOEM(MS-DOS)コードページで動作します。ドットメタ文字は、拡張ASCII文字のいずれとも一致しません。その結果、非英語のテキストに対してはあまり役立ちません。また、Unicode文字(UTF-8またはUTF-16)を検索することもできません。
結論
findstr /?
や find /?
を入力することで、他のスイッチについて学ぶことができます。例えば、追加のスイッチを使用すると、サブディレクトリ内を検索したり、行番号を出力したりできます。公式ドキュメントも参照してください。
一般的に、find
や findstr
コマンドは古くなっており、さまざまな奇妙な挙動や制限があります。
Source:
https://dzone.com/articles/search-from-the-windows-command-prompt