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