For compatibility and ease of use it’s often better to use FIND to do this.
You must also consider if you would like to match case sensitively or case insensitively.
The method with 78 points (I believe I was referring to paxdiablo’s post) will only match Case Sensitively, so you must put a separate check for every case variation for every possible iteration you may want to match.
( What a pain! At only 3 letters that means 9 different tests in order to accomplish the check! )
In addition, many times it is preferable to match command output, a variable in a loop, or the value of a pointer variable in your batch/CMD which is not as straight forward.
For these reasons this is a preferable alternative methodology:
Use: Find [/I] [/V] “Characters to Match”
[/I] (case Insensitive)
[/V] (Must NOT contain the characters)
As Single Line:
ECHO.%Variable% | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )
Multi-line:
ECHO.%Variable%| FIND /I "ABC">Nul && (
Echo.Found "ABC"
) || (
Echo.Did not find "ABC"
)
As mentioned this is great for things which are not in variables which allow string substitution as well:
FOR %A IN (
"Some long string with Spaces does not contain the expected string"
oihu AljB
lojkAbCk
Something_Else
"Going to evaluate this entire string for ABC as well!"
) DO (
ECHO.%~A| FIND /I "ABC">Nul && (
Echo.Found "ABC" in "%A"
) || ( Echo.Did not find "ABC" )
)
Output From a command:
NLTest | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )
As you can see this is the superior way to handle the check for multiple reasons.
Findstr command on Windows is useful for searching for specific text pattern in files. It’s functionality is similar to the grep command on Linux OS. You can find below the syntax of ‘findstr’ for various use cases.
Search for text/string in a file:
findstr pattern filename
For example, to search for the string ‘Windows’ in the text file CLItips.txt, the command would be as below.
findstr Windows CLItips.txt
Note that the above command looks for exactly ‘Windows’. It considers case by default. So if you have a line that has the word ‘windows’, it would not be printed in the output of the above command.
Ignore text case:
You can add /I switch to ignore the case in the search. So if you run ‘findstr windows /I CLItips.txt‘, it does case insensitive pattern matching.
Search for any of the given words
If you want to print the lines having any of the given word set, you can enclose the list of words in double quotes in findstr command.
findstr "word1 word2 word3.." filename.txt
findstr "Apple Orange" fruits.txt
This command would print a line if it has has either the word ‘Apple’ or the word ‘Orange’ or both the words.
Search for pattern with multiple words
findstr /C:"word1 word2 word3..." filename
/C indicates that the search pattern has to be matched literally.
For example, to search for the string “Apple Ball Cat” in file Book.txt, the command would be as below
findstr /C:"Apple Ball Cat" Book.txt
Search with Regular Expressions
You can use regular expressions with findstr /R switch. Typical command would be as below.
findstr /R pattern filename.txt
Here the pattern can be specified using regular expressions.
Examples:
Search for the occurrence of all words ending with ‘xyz’ in a file.
findstr /R [a-z]*xyz filename.txt
Search for text in all the files in a current directory
You can use wildcard ‘*” to specify that all the files in a directory should be searched for the given string.
For example, to search for ‘windows’ in all the files in the current directory, you can use the below command.
findstr /I windows *
To search all the text files in the directory C:data:
findstr /I windows C:data*.txt
Search for multiple strings
If you need to search for multiple strings, then you can do that with the below batch script.
@echo off for /F %%i in (pattern.txt) do ( echo Files containing %%i findstr /M /C:%%i /S *.txt )
‘pattern.txt ‘is the file having the strings(one per line) that need to be searched for. The above command searches only text files. You can customize the findstr command in the script to search in files with other extensions. Adding ‘/M’ option to the command causes to print only the file names.
Print only the lines where the given string is at the beginning of the line.
You can add /B switch to indicate that the specified string should be in the beginning of the line.
findstr /B /C:windows CLItips.txt
Print only the lines where the given string is at the end of the line
findstr /E /C:windows CLItips.txt
Print line numbers for all the matched lines.
You can add /N switch to the findstr command to print line numbers for the matched lines.
Print only the filenames
finstr /M /C:"pattern" *.log
This command searches for the pattern in all *.log files, and then prints only the file names having the pattern. Even if a file has multiple occurrences of the pattern, it’s printed only once by findstr.
Позавчера мне пришлось написать простенький командный файл, бекапящий профиль приложения. В качестве имени папки с резервной копией мне возжелалось использовать переменные окружения %date% и %time%. Если вы проходили в институте начальный курс информатики, вы должны знать, что %time% в этом случае является ничем иным, как граблями, остро торчащими на пути, так значение содержит недопустимый символ “:”. Я никогда не занимался разбором строк в командных файлах, и случай как нельзя лучше подходил для того, чтобы прокачать свои скилы.
Я хочу поделиться с вами своими изысканиями, и анонсирую скучную, унылую техническую статью. Дочитавшему до конца – покажу котика.
В современных ОС интерпретатор командной строки позволяет выполнять простейшие строковые операции:
- Замену подстроки в строке
- Поиск подстроки
- Выделение подстроки
- Работа с наборами “ключ – значение”
Замена символов/подстроки в переменной командной строки
Это то, что мне было нужно в первую очередь. Напомню, моя задача в первую очередь избавиться от двоеточий.
Решается очень просто:
[code]set mytime=%time::=_%[/code]
В этом примере используется синтаксис вида:
[code]%Переменная:ЧтоНайти=НаЧтоЗаменить%[/code]
В моем случае заменяется двоеточие на символ нижнего подчеркивания, и результат выглядит так:
Само собой, можно заменять не отдельные символы, а целые словосочетания:
Как ещё можно воспользоваться функцией замены? Например:
Удалить все пробелы из значения переменной
[code]echo %var: =%[/code]
Замена какой-либо части строки
Вы можете использовать символ “*” для определения того, что обработке подлежит часть строки, предшествующая указанному выражением. Я не знаю, как написать это по-человечески, вот что я имею ввиду:
К сожалению, “звёздочкой” нельзя указать, что отсечь надо часть строки после указанного выражения. Эта задача решается в два этапа:
- в отдельную переменную помещается строка, из которой удалено всё, что находится до ключевого выражения. Т.е. в ней остается “хвост”, искомое выражение плюс всё, что после него.
- затем из оригинальной переменной удаляется значение переменной, полученной на первом шаге. Здесь потребуется вызов команды СALL:
Инструкция CALL необходима для разворачивания значения переменной, подлежащей замене. Без неё интерпретатор отработает неверно, и вот эта конструкция не сработает:
[code]echo %var1:%var%=%[/code]
Необходимо писать:
[code]call echo %var1:%var%=%[/code]
Не забывайте, что при использовании таких конструкций в командных файлах знаки процентов должны быть удвоены:
[code]rem Работаем внутри командного файла
call echo %%var1:%var%=%%[/code]
Поиск подстроки
Используя опыт, полученный выше, можно написать простейшую проверку вида “содержит/не содержит”.
Например, вот так:
[code]set var1=Мама мыла раму
set var2=%var1:Мама=%
if NOT “%var1%” == “%var2%” (echo Подстрока найдена)[/code]
Или
[code]set var1=Мама мыла раму
set var2=%var1:Мама=%
if NOT “%var1%” == “%var2%” (echo Подстрока найдена) else (echo Подстрока не найдена) [/code]
Выделение подстроки из переменной
Для получения подстроки из строки командный интерпретатор предоставляет такую конструкцию:
[code]set var2=%var1:~начальная_позиция%
set var2=%var1:~начальная_позиция,-отбросить_символов_с_конца_строки%
set var2=%var1:~начальная_позиция,длина%[/code]
Синтаксис очень простой, поэтому сразу перейдем к примерам.
Выделение подстроки с начиная определенной позиции
Выделение части строки, например, “середины”
Выделение определенного количества символов
Начальная позиции строки – нулевая.
Работа с наборами “ключ – значение”
Здесь, в общем-то, тоже никакой магии нет. В основе разбора лежит всё та же рассмотренная выше замена подстроки на пустое значение.
Алгоритм действий такой:
- Создается переменная, содежащая в себе значения вида <ключ><разделитель значения><значение><разделитель пары>. Назовем её условно “словарь”.
- В переменную, которая будет содержать значение, записывается всё, что следует после ключа. По аналоги с заменой части строки, нужно использовать звездочку перед выражением <ключ><разделитель значения>.
- Полученный результат нужно “почистить”, так как он может содержать в себе остаток словаря. Для этого прибегнем к хитрости и выполним составную команду.
Предположим, мы в качестве разделителя пары словаря используем точку с запятой. Тогда мы сможем довольно изящно “убить” оставшуюся часть словаря, поместив его в комментарии командой rem.
[code]set value=%value:;=&rem %[/code]
После rem – пробел, это важно(rem /?)
Теперь практический пример:
Я надеюсь, эта информация оказалась для вас полезной и сэкономит вам время, если у вас появится задача обработки строк. Впрочем, тему я раскрыл не полностью, и если у вас есть какие-то дельные личные наработки и приёмы обработки строк в командном интерпретаторе Windows, я совсем не против увидеть их в комментариях.
Материалы по теме:
http://ss64.com/nt/
Форум о скриптах на OSZone – рекомендую.
Спасибо, что дочитали до конца.
Узнавайте о новых статьях быстрее. Подпишитесь на наши каналы в Telegram и Twitter.
Судя по тому, что вы читаете этот текст, вы дочитали эту статью до конца. Если она вам понравилась, поделитесь, пожалуйста, с помощью кнопок ниже. Спасибо за вашу поддержку!
Grep is a command-line option used to find a specific string from inside a file or multiple files or from an output of a command but it can be used only in Linux. For Windows, the grep alternative is findstr.
Most of the users who use Linux are very comfortable with using command-line. And one of the basic requirement is to find specific strings within specific file or files or even from the output of a particular command. Grep is a command-line option used to find a specific string from inside a file or multiple files or from an output of a command but it can be used only in Linux. For Windows, the grep alternative is findstr.
Since Windows users are not used to use command-line for smaller things, most of the users don’t know how to find a specific string in files using Windows command-line or even PowerShell. In this article, we will discuss about how to use findstr (equivalent of Grep in Windows) in command prompt and also how to use the find function using PowerShell. Let’s discuss about different scenarios which can be used in real-world situations.
Table of contents
- Filter an output of a command Using Command Prompt
-
Search for a specific string inside a single file Using Command Prompt
- Search for a specific string in a folder using Findstr
Filter an output of a command Using Command Prompt
If you want to filter the results of a command, you can use | findstr “string_to_find”
For example, I mostly use netstat for checking the connections being made on my computer. If I want to check which app or IP address is connected to a specific port, I’ll use the following command:
netstat | findstr “imaps”
This will show me only secure imap ports opened on my computer.
Search for a specific string inside a single file Using Command Prompt
The command for this purpose is:
findstr “string_to_find” “file_name”
For example,
findstr “reader” “new 1.txt”
You can also give full path of the file if it’s not in the same directory as opened in command prompt.
Search for a specific string in a folder using Findstr
You can also specify a folder for finding a specific text string in multiple files.
findstr /M “reader” “C:UsersUsmanDesktop*”
This will give a list of all files with full path containing the text string “reader”. If you don’t specify /M, the output will show the exact text string along with the file name where it found the string.
You can go through all the switches you can use with the command here.
This command can be useful in many cases especially when I am creating a log of network activities and have to find a specific thing from the log. What do you do with this filter command “findstr”?
В этой статье мы с вами рассмотрим утилиту findstr и find командной строки, которые позволяет производить поиск строк в текстовом документе. Поиск через командную строку можно также настроить, используя шаблоны, которые настраиваются на основе регулярных выражений, но сперва, немного лирики…
В былые времена, когда я был еще полным чайником в компьютерах, мне пришлось услышать про волшебные “виртуальные диски”. В то время размер моего винчестера составлял 2 гигабайта, и на счету был каждый байт, я каждую картинки сжимал для экономии места, зато в системе был один фильм и одна игра “Age Of Empires 2”, я ее уже раз сто проходил. Так вот, я почему то решил, что “виртуальный диск”, это дополнительная память, которая может появится из воздуха… Где то два дня пытался всячески установить через Диспетчер устройств еще один винт на 500 метров, при том, что такого оборудования в системном блоке и подавно не было…
Утилита find командная строка
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] “искомые_значения” [[диск:][путь]имя_файла[ …]]
И так, смотрим на описание ключей:
[/V] – произвести вывод всех строк, которые НЕ содержат заданной.
[/C] – выводится только общее число строк, содержащих заданную.
[/N] – Вывод номеров отображаемых строк.
[/I] – Поиск без учета регистра символов.
[/OFF[LINE]] – Не пропускать файлы с установленным атрибутом «Автономный».
“искомые_значения” – собственно, строчка, поиск которой производится из командной строки Windows
[[диск:][путь]имя_файла[ …]] – тут мы прописываем один или несколько имен документов, в которых нужно произвести поиск через командную строку, можно использовать подстановочные знаки.
Хорошо, теперь давайте попробуем написать несколько примеров.
Создадим на диске D: папку TEST, в который благополучно поместим три файла с расширениями .pdf, .txt и .mf. Для начала попробуем найти слово «const» во всех документах с расширением txt:
FIND “const” D:TEST*.txt
На выходе мы получим следующую информацию:
———- D:TESTSEND_MAIL_DATA.VBS.TXT
соnst toMSg =»to@yandex.ru» ‘получатель
соnst fromMSg =»from@gmail.com» ‘отправитель
соnst subjMsg = «Администратор» ‘субъект
соnst sndUsr =» login» ‘логин
соnst sndPswd =»password» ‘пароль
cоnst smtpSrvr = «smtp.gmail.com» ‘почтовый сервер
———- D:TESTSEND_MAIL_TEXT.VBS.TXT
cоnst toMSg =»to@yandex.ru»
cоnst fromMSg =»from@gmail.com»
cоnst subjMsg = «Администратор»
cоnst sndUsr =» login»
сonst sndPswd =»password»
сonst smtpSrvr = «smtp.gmail.com»
———- D:TESTSUBDOMEN_SCAN.WSF.TXT
Как видим, мы получили список всех тех строчек, где встречается искомое слово.
Теперь попробуем сделать поиск через командную строку слова “samsung” во всех pdf файлах:
FIND “samsung” D:TEST*.pdf
Слово «samsung» встречается в одном документе, но, утилита FІND найти его не смогла, стоит обратить внимание, что и стандартный поиск операционной системы Windows также ничего не нашел, видимо, Google в этом все же больше преуспел.
Теперь попробуем усложнить задачу. Дело в том, что Windows ищет фразу не только в контексте файла, но и в его свойствах. Посмотрим, будет ли утилита find командной строки Windows производить поиск из описания. Я специально, по одному из каждого типа файлов (.pdf, .txt и .mf) вставлю в описание фразу «Victoria Sanremo». И так, приступим:
FIND “Victoria Sanremo” D:TEST*.*
В результат выполнения команды find, командная строка ничего не нашла в свойствах документов. Кроме утилиты FІND, есть еще и CMD FINDSTR, которая обладает немного большими возможностями.
Утилита FINDSTR командная строка
Утилита CMD FINDSTR предоставляется возможность осуществить поиск текста через командную строку не только в одном файле, или группе документов заданных по шаблону, но и с возможностью загрузки готового списка. И так, прежде всего, давайте посмотрим на основной синтаксис.
FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:файл][/C:строчка] [/G:файл] [/D:список_папок] [/A:цвета] [/OFF[LINE]] “искомые_значения”[[диск:][путь]имя_файла[ …]]
/B – Данный ключ определяет поиск образца лишь в началах строчек.
/E — Данный ключ определяет поиск образца лишь в конце.
/R – Фразы и слова будут приниматься как регулярные выражения.
/S – Производит поиск файлов через командную строку в текущем каталоге и всех его подпапках.
/I – Данный ключ определяет, что поиск фразы из командной строки будет вестись без учета регистра.
/X – Производит вывод только тех строчек, которые содержат точное совпадение.
/V — Производит вывод только тех строчек, которые не содержат точного совпадения с искомой фразой.
/N — Производит вывод номера строчки (которые содержат точное совпадение) и ее содержимое.
/M — Производит вывод лишь имени документа, который содержит совпадение.
/O – Вывести список найденных строк через пустую строчку.
/P – Данный параметр определяет, что произойдет пропуск всех строк, которые содержат непечатаемые символы.
/OFF[LINE] — Не пропускает те документы, у которых установлен атрибут «Автономный».
/A:цвета – Шестнадцатеричный код цвета, для получения справки можете ввести команду «COLOR /?»
/F:файл – Производит чтение списка файлов из заданного документа.
/C:строчка – Использовать значение данного параметра как искомую фразу поиска.
/G:файл – Позволяет получить список строк из заданного документа.
/D:список_папок – Тут через точку с запятой мы можем задать список каталогов, в которых нужно произвести поиск через командную строку.
“искомые_значения” – Собственно, то, что мы ищем.
[диск:][путь]имя_файла — Задаем путь к документу (документам)
Что бы разделить между собой искомые фразы, между ними вставляется пробел, если параметр не содержит префикса /C. Например,
FINDSTR “Привет мир” data.txt
ищет «Привет» или «мир» в файле data.txt, а команда
FINDSTR /C:”Привет мир” data.txt
ищет фразу «Привет мир» в файле data.txt.
Регулярные выражения являются своеобразным бонусом, которым не то, что оболочка, но и язык программирования не всегда может похвастаться. При поиске из командной строки, регулярные выражения позволяют задавать собственные шаблоны (для справки по некоторым значениям введите в cmd findstr/? ), они также используются в сценариях сервера Windows Script Host, за это отвечает отдельный объект.