Поиск из командной строки Windows

Команда FIND

Для поиска текста в нескольких файлах из командной строки Windows или в скриптах batch, можно использовать команду 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.

В скриптах batch, можно использовать тот факт, что команда 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: Поиск по регулярным выражениям

Если вам нужно найти регулярное выражение, попробуйте команду FINDSTR, которая была введена в Windows XP. По историческим причинам, findstr поддерживает ограниченный набор регулярных выражений, поэтому вы можете использовать только эти особенности регулярных выражений:

  • Точка . соответствует любому символу, кроме символа новой строки и расширенных ASCII символов.
  • Списки символов [abc] соответствуют любому из указанных символов (a, b или c).
  • Диапазоны списков символов [a-z] соответствуют любой букве от a до z.
  • Звездочка (*) указывает, что предыдущий символ может повторяться ноль или более раз.
  • Символы \< и \> обозначают начало и конец слова.
  • Крест (^) и знак доллара ($) обозначают начало и конец строки.
  • Обратная косая черта (\) экранирует любой метасимвол, позволяя найти буквальные символы. Например, \$ находит сам знак доллара.

Findstr не поддерживает классы символов (\d), альтернативы (|) или другие повторения (+ или {5}).

Базовая синтаксис такой же, как и для команды FIND:

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

Эта команда находит все годы, начинающиеся с 2000 года, в .htm файлах текущего каталога. Так же, как и с find, используйте переключатель /I для нечувствительного к регистру поиска:

Ограничения и особенности FINDSTR

Списки символов [a-z] всегда нечувствительны к регистру, поэтому echo ABC | findstr "[a-z]" соответствует.

Пробел действует как метасимвол альтернации в findstr, поэтому запрос поиска, например, findstr "new shoes" * найдет все строки, содержащие либо new, либо shoes. К сожалению, нет возможности экранировать пробел и использовать его как буквальный символ в регулярном выражении. Например, невозможно найти строки, начинающиеся с пробела.

Синтаксические ошибки в регулярном выражении игнорируются. Например, findstr "[" * будет соответствовать всем строкам, содержащим символ [.

Если файл содержит переносы строк Unix (LF), метасимвол $ работает некорректно. Если последняя строка файла не содержит символа конца строки, findstr не сможет ее найти. Например, findstr "</html>$" * не сработает, если после </html> нет CR+LF.

Ранние версии Windows имели ограничения на длину строки для команд find и findstr, а также других команд. В последних версиях эти ограничения были сняты, поэтому больше не нужно беспокоиться о них. См. этот вопрос на StackOverflow о findstr ограничениях и ошибках, особенно в ранних версиях Windows.

Команда 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