Grep не является внутренней или внешней командой для исполняемой программы или пакетного файла
Обновлено: 21.11.2024
Итак, если у вас есть файл с именем go.exe и go.bat, и вы набираете в командной строке просто go, то go.exe будет запущен. Если вы хотите запустить пакетный файл, вы должны ввести go.bat, чтобы переопределить поведение по умолчанию.
Все команды имеют одинаковую структуру и синтаксис. Как только вы поймете этот простой синтаксис, команды не будут казаться такими загадочными и произвольными. Структура команды:
Некоторые команды Windows принимают знак минус -, а также косую черту / (Linux и Mac OS X не используют косую черту): р>
- Самый первый элемент командной строки ДОЛЖЕН быть командой (внутренней или внешней).
- Поведение некоторых команд можно изменить с помощью различных параметров.
- Некоторые параметры требуют аргументов, а некоторые параметры имеют необязательные аргументы.
- Многие команды требуют указания аргументов и параметров.
- Многие команды ведут себя по умолчанию при отсутствии параметров или аргументов.
- Один или несколько пробелов разделяют параметры и аргументы. (Вот почему имена файлов и папок с пробелами — плохая идея.)
- Если вы должны иметь дело с файлом или папкой с пробелом в имени, заключите его в "двойные кавычки".
- Некоторые команды позволяют смешивать параметры с аргументами. (Некоторым командам требуются все параметры до или после всех аргументов команды.)
Перенаправление и конвейер
В этом и заключается настоящая сила командной строки. Просто невозможно (или, по крайней мере, чрезвычайно сложно) сделать это с помощью графического пользовательского интерфейса (GUI). Информации об этом в Интернете предостаточно. Вы можете начать здесь и здесь, чтобы узнать больше об этом для Windows.
К счастью, в Windows есть возможность выполнять перенаправление и конвейерную передачу, но, к сожалению, в Windows нет большинства необходимых команд/программ для использования этих методов. Самый простой способ получить эти отсутствующие команды/программы — установить Cygwin в Windows. Это даст вам 95% того, что вам нужно для продуктивной работы из командной строки в Windows. Для Linux и Mac OS X все необходимые команды/программы уже присутствуют.
- Чтобы перенаправить ввод из файла в программу с помощью оператора. (Пример: prog > output.txt)
- Чтобы добавить выходные данные в файл (вместо перезаписи файла), используйте оператор >>. (Пример: prog >> output.txt)
- Чтобы подключить стандартный вывод одной программы к стандартному выводу другой программы, используйте оператор |. (Пример: прог1 | прог2)
Примеры, показывающие команды, перенаправление, конвейер, переключатели, аргументы: (sort, cut и uniq являются частью Cygwin, а не Windows )
Вот ip.txt с компьютера с Windows XP. Вам придется изменить приведенную выше команду для Windows 7, поскольку формат вывода изменился.
Подробная информация о командной оболочке Windows NT. Кстати, Windows NT Windows NT является основой для всех операционных систем NT (2000, Vista, 7 и т.д.) Предыдущие версии Windows (Windows 3.0, Windows 95, 98) отличались (внутренне). И да, Windows NT действительно начиналась с версии 3.1!
Маркетинговое название Внутреннее название Дата выпуска Номер сборки . Windows NT 3.1 NT 3.1 Июль 1993 г. 528< /td> Windows NT 3.5 NT 3.5 Сентябрь 1994 807 Windows NT 3.51 NT 3.51 Май 1995 1057 < /tr>Windows NT 4 NT 4.0 Июль 1996 г. 1381 Windows 2000 NT 5.0 Декабрь 1999 2195 Windows XP NT 5.1 Август 2001 2600 Windows Server 2003 NT 5.2 март 2003 3790 Windows Vista NT 6.0 Январь 2007 г. 6000 Windows Server 2008 NT 6.0 Март 2008 6001 Windows 7 NT 6.1 Октябрь 2009 г. 7600 Windows Server 2008 R2 NT 6.1 Октябрь 2009 7600 Windows 8 NT 6.2 Октябрь 2012 td>9200 Windows Server 2012 NT 6.2 Сентябрь 2012 9200
При программировании пакетных файлов используется множество команд, и, как и большинство программ, они следуют правилу 80/20 (или даже 90/10):
Самый быстрый способ узнать, как работает команда, — это получить справку из командной строки. В Windows нет таких средств, как справочные страницы в Linux и Cygwin. Вместо этого, чтобы получить справку по типу команды:
По моему мнению, именно эти команды вы будете использовать чаще всего. Считайте их «основными» командами. Что ж, некоторые из них на самом деле не являются основными, но они просты, и вы можете найти их полезными сами по себе или в пакетных файлах.
- Изменение размера и шрифта командного окна
- Изменение цвета текста и фона (COLOR)
- Включение режима быстрого редактирования и размеров буфера
- Изменение того, что отображается в подсказке. (ПОДСКАЗКА)
Кстати, основная часть этого справочника была создана с помощью пакетного файла makehelp.bat. Изменение его таким образом, чтобы были гиперссылки и он соответствовал приведенному ниже выводу, — это упражнение для студента. Результирующий вывод в формате HTML будет выглядеть следующим образом: winhelp.html.
Команда grep в Linux широко используется для анализа файлов и поиска полезных данных в выходных данных различных команд.
Команда findstr является эквивалентом Windows grep в командной строке Windows (CMD).
В Windows PowerShell альтернативой grep является команда Select-String.
Ниже вы найдете несколько примеров того, как выполнить «grep» в Windows, используя эти альтернативы.
Полезный совет. Эквивалент команды Windows touch в CMD и PowerShell! Читать далее →
Команда Grep в Windows
Соберите вывод команды netstat для определенного порта:
Если команда в PowerShell возвращает какие-то объекты, перед синтаксическим анализом их следует преобразовать в строки с помощью команды Out-String -Stream:
Выполните поиск файла по шаблону, соответствующему регулярному выражению (без учета регистра):
Параметры, используемые командой findstr в приведенном выше примере:
Показать справку по эквивалентам команды Windows grep:
Полезный совет: Эквивалент команды Windows cat в CMD и PowerShell! Читать далее →
14 ответов на вопрос «Windows: эквивалент `Grep` — CMD и PowerShell»
Привет. Я попытался ввести командную строку
` C:\> netstat -na | findstr «2020»` и введите, и это не работает. Я хочу искать в каталогах документа Word некоторые строки. Кажется, я что-то упустил в ваших объяснениях
Отличный текст. Я нашел именно то, что мне было нужно.
Одно исправление, однако, заключается в вызове справки findstr, которая соответствует обычной форме других команд Windows: findstr /?
Спасибо!
PS C:\Users\Administrator> auditpol.exe /get /category:* | findstr «Репликация службы каталогов»
Службы сертификации Нет аудита
Изменения службы каталогов Нет аудита
Репликация службы каталогов Нет аудита
Подробная репликация службы каталогов Нет аудита
Доступ к службе каталогов Нет Аудит
Операции с билетами службы Kerberos Без аудита
Служба проверки подлинности Kerberos Без аудита
мне нужно точное совпадение, пожалуйста, помогите мне, это срочно
используйте find вместо findstr (findstr вернет все совпадения с каталогом, службой или репликацией, find вернет совпадение всей строки (с учетом регистра). Используйте find -i, чтобы игнорировать регистр.
Мне нужен один вывод, который точно соответствует слову в слове
auditpol.exe /get /category:* | findstr /C:"Репликация службы каталогов"
Знаете ли вы, почему команда Select-String в PowerShell возвращает только совпадение с шаблоном, а findstr возвращает всю строку целиком, как это делает grep?
Например:
Если я использую Set-Alias -NAME grep -Value Select-String
'Get-Alias |Select-String grep' вернет:
grep
'Get-Alias |findstr grep' вернет:
Alias grep -> Select-String
Есть ли способ получить тот же вывод Select-String, но только для использования команд PowerShell?
Проблему вызывает поведение команды get-alias.
Сначала преобразуйте вывод в строки:
‘Get-Alias | Out-String -поток | Select-String grep’
Большое спасибо. полезно для меня.
Отличная информация, которая может помочь мне разгадать загадку. спасибо
Я пытаюсь создать командный файл для win 10, чтобы найти конкретный процесс, который постоянно «зависает». Дело в том, что его pid меняется при каждом использовании. Я бывший программист начального уровня для среднего уровня, и я «зависаю» на многих процессах, поскольку я разрабатываю банальное программное обеспечение на старости лет. Мне нужно использовать что-то вроде списка задач, чтобы перечислить все НЕ ОТВЕЧАЮЩИЕ процессы, найти процесс или PID, который мне нужно убить, и отправить эту информацию в taskkill, чтобы выполнить работу. Если кто-нибудь прочитает это и может помочь мне с приличным пакетным файлом, я буду очень признателен. Я уже прочитал много статей, но не могу заставить его работать. Заранее спасибо лучшему человеку, которого я могу честно назвать на данный момент лучшим человеком в мире 🙂
У меня есть большой TXT-файл с десятками тысяч строк.
Я хочу найти все 500 или около того строк, содержащих определенную строку (например, «всплывающее окно»), и извлечь эти строки в другой выходной файл для дальнейшей обработки. Строка уникальна для строк, которые я хочу извлечь, и встречается только один раз в каждой такой строке.
Я уже много лет не программирую (макросы на Фортране, Бейсике, Excel), но хочу научиться чему-то современному. Я работаю на ноутбуке с Win10 и ищу совета: что было бы самым простым и быстрым (Python, Perl, Powershell, …), что позволило бы мне сделать вышеперечисленное?
Команда powershell Select-String отлично справляется с этим с правильным регулярным выражением, как и большинство других языков оболочки. В powershell вы можете запустить эту команду:
Выберите строку ‘^.*YOURSTRING.*’ c:\PATH\TO\INPUTFILE.TXT | % > c:\PATH\TO\OUTPUTFILE.TXT
Краткий обзор этой команды:
* Регулярное выражение ^.*YOURSTRING.* выбирает всю строку, содержащую YOURSTRING
* % выбирает только строки регулярного выражения; без него ваш выходной файл будет иметь имя файла и номер строки в каждой строке
* > записывает вывод в файл
Я единственный, кто использует старую добрую командную строку grep?
Нет. Я лично использую старый grep gnuwin32, хотя меня не удивит, если будут более современные (или 64-битные) версии, перенесенные в исполняемые файлы Windows.
@Ekopalypse (извините за язвительный ответ, но ваша формулировка требовала этого)
Эти же ошибки возникают у меня, когда я пытаюсь запустить на своем ПК приложение, которое я не устанавливал, например, FileLocator/AgentRansack, о котором вы упомянули:
возможно, поэтому я его не использую :-D
Вряд ли причина в этом, потому что установить gnuwin32 grep так же легко (или даже проще), как и установить FileLocator/AgentRansack.
А-а, я так и понял, что это системный инструмент.
У меня в каталоге C:\usr\bin\ установлен grep.exe вместе с Git для Windows (который предоставляет собственный grep ), но я предпочитаю версию GnuWin32.
Лично я предпочитаю разделять командную строку и программы с графическим интерфейсом. Я позволю программе с графическим интерфейсом, такой как Notepad++, делать то, в чем она хороша, а инструменту командной строки, например grep, делать то, в чем она хороша. Если мне нужна мощность командной строки, я использую инструмент командной строки (и обычно что-то, написанное изначально для Linux и перенесенное на Windows); когда мне нужна графическая среда, я использую родное приложение win32.
Таким образом, если один из файлов, которые я хочу найти, уже открыт в Notepad++, я вызову функцию «Найти в файлах» и заставлю ее рекурсивно искать структуру каталогов относительно текущего файла. Но если у меня есть что-то, что я пытаюсь найти в другом месте (что бывает чаще), или если я хочу точно контролировать аргументы в стиле командной строки, я, скорее всего, вытащу grep. (что объясняет, почему я вряд ли буду использовать аргументы -ff., предложенные Виталием.
Но я вижу, что для тех, кто предпочитает всегда использовать графический интерфейс для своих результатов поиска, независимо от того, запущен ли он из графического интерфейса или из командной строки, я могу увидеть преимущество того, что этот поиск является частью Notepad ++, а не специализированным Приложение с графическим интерфейсом, подобное упомянутым другими.
…но что-то встроенное в Npp может заставить меня удалить его.
Я думаю, что мы что-то упускаем из виду.
Notepad++ не лучший инструмент для поиска.
Вот, я сказал это. :-)
Жду пламени.
Может быть, grep не подходит для нескольких каталогов, которые не находятся в одном дереве? Слишком много, чтобы указать, или, может быть, есть хороший способ сделать что-то подобное через файл конфигурации?
Указание такой вещи проблематично даже для лучших инструментов.
Это также недостаток Notepad++.
Кроме того, grep использует yare (еще один механизм регулярных выражений).
Grepper в RegexBuddy позволяет мне выбрать механизм регулярных выражений, который я хочу использовать (обычно я устанавливаю его таким же, как N++, т. е. Boost).
RegexBuddy действительно отличная цена, я думаю, 35 долларов США.
@Alan-Kilborn - процитирую известное "как ты смеешь??" :-D
Честно говоря, у меня никогда не было с этим проблем. Да, есть решения получше, вроде того, что я выложил, но для того, для чего я его использую, этого вполне достаточно. Может быть, потому что я использую только файлы в кодировке utf8.
Поиск в N++ медленный, и, как упоминалось ранее, как искать в нескольких разных деревьях?Кроме того, вы не можете ничего делать с ним, пока он выполняет поиск.
Это прекрасно подходит для большинства задач (интерактивный поиск следующего, поиск всего в текущем файле и т. д.), но когда вы ищете большое количество файлов, есть другие и лучшие способы ободрать эту кошку.
И поскольку именно об этом было начало этой ветки (автоматизация и без того не очень хорошей функции), я говорю "да" первоначальной идее. Не то, что я бы использовал. Но я уважаю тех, кто хотел бы, и их мнения по теме.
Идея великолепна, потому что тогда я могу легко запустить новый экземпляр, и он не блокирует мой текущий экземпляр.
Идея великолепна, потому что тогда я могу легко запустить новый экземпляр, и он не блокирует мой текущий экземпляр.
Если я подумываю о том, чтобы «вызвать» таким образом, я обращусь к более мощной поисковой программе. :-)
И когда эта более мощная программа покажет мне совпадения и я захочу перейти к одному из них, я вызову эту программу обратно в Notepad++, чтобы перейти к файлу и строке попадания. р>
Не уверен, что понимаю, но, в конце концов, все зависит от личных предпочтений.
Я имею в виду, что если я использую Npp из-за его функции поиска, то я думаю, что использую неправильный инструмент для работы.
С другой стороны, если я в основном редактирую, то хорошо иметь мощную функцию поиска, как у Npp, и если ее можно легко запустить из Npp и не блокировать меня - тем лучше.
Ну, теоретически мы могли бы собрать воедино все, что знаем, и создать желаемую функциональность с помощью скриптов… если бы она не использовалась изначально. Там будет много отдельных частей, но я не могу придумать ничего, что могло бы стать «пробкой».
Да, это (обычно) всегда работает :-D
- вызвать новый экземпляр N++ с новыми параметрами в командной строке
- выбор параметров из командной строки (@Ekopalypse показал нам, как это сделать в прошлом)
- вызов диалогового окна Найти в файлах после запуска N++
- заполнение полей в разделе Найти в файлах данными командной строки
- запуск функции Найти в файлах
Хорошо, всего 4 основных шага, но некоторые из них содержат много «мяса».
Я не знаю, достаточно ли у меня интереса к базовой теме, чтобы разработать сценарий, но сценарист во мне считает, что писать его было бы веселее, чем использовать его было бы полезно. :-)
YAREST (еще один инструмент поиска по регулярным выражениям)
Я использую grepWin от Stefans Tools.
он хорошо работает как команда меню "Выполнить":
и я считаю, что это прекрасно устраняет разрыв между CL и графическим интерфейсом. Потребовалось очень небольшое количество работы (оболочка пакетного файла), чтобы заставить его использовать папки и расширения файлов по умолчанию, поскольку я предпочитаю их для обычных вызовов CL. [Но иногда я все же запускаю GnuWin32 grep (во-первых, меньше печатать)]
То, что он использует движок регулярных выражений Boost, немного неясно — похоже, это не афишируется — это определенный плюс для пользователей N++, которые привыкли к нему для поиска.
@Alan-Kilborn
Я не думаю, что автор считает это важным аргументом в пользу продажи; для многих людей RE есть RE, пока их не укусят различия во вкусе.
Автор заявляет на мини-странице справки на своем веб-сайте:
grepWin использует механизм регулярных выражений boost для выполнения своей работы с синтаксисом регулярных выражений Perl.
На экране справки F1 в grepWin есть ссылки на документацию Boost верхнего уровня (независимую от версии) (которая на сегодняшний день имеет «выпуск», преобразующийся в «1_77_0»):
Исходный код проекта на github для текущей версии (2.08) показывает, что он использует Boost 1.76.0.0.
Я не пробовал какие-либо формы «доказательства Boostness», поскольку обычно использую grepWin для поиска, похожего на «Какие файлы в этом проекте ссылаются на конкретную константу манифеста?» или «Я определил это слово в другом текстовом файле в этом дереве папок?»
Он предлагает функцию замены, которая хорошо работает с заменами обычного текста. Я пробовал замены регулярных выражений только пару раз (все работало нормально). По умолчанию grepWin сохраняет копию исходного файла с добавлением расширения .bak для обоих стилей замены.
Для многих людей РЕ есть РЕ, пока их не укусят различия во вкусе.
Вы очень хорошо сказали. :-)
grepWin использует механизм регулярных выражений boost для выполнения своей работы с синтаксисом регулярных выражений Perl
Я не очень понимаю, что это значит (последняя часть).
Я также видел другие связанные ссылки, называющие его синтаксисом PCRE (Perl Compatible Regular Expression).
Для меня это "синтаксис Boost RE".
Я думаю, что мое вступительное заявление (Кстати: я думал, вам понравится) также касается смешения авторами различных названий RE.
Поздно, но я искал способ сделать что-то подобное "из командной строки".
У меня есть утилита для поиска данных в базе данных. В нем перечислены совпадения, и, если пользователь выберет одно из них, запишет соответствующее содержимое во временный файл и откроет его в Notepad++. Однако, чтобы НАЙТИ данные из этой точки, пользователь должен открыть диалоговое окно поиска, ввести текст еще раз и нажать кнопку "Перейти".
Мне бы хотелось найти способ предварительного поиска ТОЛЬКО файла, открытого из командной строки, для определенной текстовой строки. Пусть совпадающие строки уже найдены, выделены и наведены курсор на первое совпадение.
В первой главе Cybersecurity Ops with bash мы рассмотрим некоторые способы использования возможностей командной строки Linux непосредственно из среды Windows.
Один из моих любимых способов сделать это — использовать подсистему Windows для Linux или WSL.
WSL был представлен как часть Windows 10 и позволяет запускать эмулированную или виртуализированную версию Linux непосредственно в Windows.
На выбор предлагается несколько дистрибутивов Linux, включая Ubuntu и Kali.
Как установить WSL в Windows 10
Чтобы использовать WSL, сначала необходимо установить его.
<р>1. В меню "Пуск" Windows выполните поиск "Компоненты Windows" <р>2. Выберите «Включить или отключить функции Windows»<р>3. Установите флажок рядом с "Подсистема Windows для Linux" и выберите "ОК"
<р>4. После завершения установки выберите «Перезагрузить сейчас»
<р>5. После перезапуска системы используйте меню "Пуск" Windows для поиска "Microsoft Store" <р>6. В Microsoft Store найдите «Linux» и выберите дистрибутив Linux, который хотите установить<р>7. Нажмите кнопку "Установить", а затем "Получить"
<р>8. После завершения установки дистрибутива Linux нажмите кнопку «Запустить».
Теперь вы готовы начать использовать подсистему Windows для Linux!
Для получения дополнительных инструкций и устранения неполадок см. инструкции Microsoft.
Как запустить WSL
После того как подсистема Windows для Linux включена и вы установили дистрибутив Linux, вы можете запустить его, открыв Командную строку Windows и введя wsl
Сообщение об ошибке — нет установленных дистрибутивов
Иногда при первом запуске WSL вы можете получить следующую ошибку:
Чтобы решить эту проблему, выполните поиск в меню «Пуск» Windows по имени дистрибутива Linux, установленного из Магазина Microsoft. Например, выполните поиск «Ubuntu»:
Нажмите на программу, чтобы запустить ее, и это должно завершить установку в вашей системе. Вы больше не должны получать сообщение об ошибке при запуске wsl из командной строки.
Оказавшись внутри дистрибутива WSL Linux, вы можете делать то, что обычно делаете, например запускать команды Linux и устанавливать пакеты.
Вы также можете напрямую запускать команды Linux из командной строки Windows, используя команду wsl и указав команду Linux в качестве аргумента.Команда будет выполнена в дистрибутиве WSL Linux, а результаты будут возвращены в командную строку Windows.
В приведенном ниже примере вы можете увидеть, как команда Cowsay в Linux запускается непосредственно из командной строки Windows:
Обратите внимание, что перед командой Linux необходимо указать wsl, иначе вы получите сообщение об ошибке. Вот неправильный метод:
А вот и правильный метод:
Конвейер и перенаправление
Вы также можете использовать конвейер ввода-вывода и перенаправление при использовании команды wsl, но вам нужно быть осторожным, чтобы убедиться, что это происходит в правильной среде операционной системы. Давайте посмотрим, что произойдет, если вы запустите следующий командный конвейер из командной строки Windows:
Обратите внимание, что в выводе указано, что команда grep не распознана. Это связано с тем, что Windows выполняет команду ps -e из среды WSL, но затем возвращает результат обратно в среду Windows. Затем Windows пытается направить этот вывод в команду grep, которая, конечно же, не существует в среде Windows. Чтобы решить эту проблему, просто снова добавьте команду wsl после конвейера, чтобы команда grep выполнялась в среде Linux.
Читайте также: