Пользователь
0,0
рейтинг
5 октября 2009 в 20:12

Администрирование → grep в Windows? Легко!

grep


Многим любителям шела нравится чудная команда grep.
К сожалению, windows нативно не имеет такой команды, по этому некоторые ставят себе наборы различных консольных утилит в *nix стиле, включая grep.

Мне, как любителю посидеть в консоли Windows очень мешало отсутствие грепа, по этому мои скрипты под Win всегда были не так хороши, как могли бы быть. Но мои скрипты должны работать на любой (ну, или почти на любой) Windows, так как же быть?

К счастью, в Windows XP (и выше) появились две команды, которые призваны исправить положение — это find и более мощный вариант — findstr.

первая простая, и имеет явный недостаток — искомый текст надо заключать в кавычки. Не знаю, как вам — но мне очень не удобно печатать кавычки каждый раз :)

findstr же этого не требует, и к тому же позволяет искать используя мощь регулярных выражений.

Таким образом, теперь надо помнить, что мы не в bash\zsh\etc, а в Win, и набирать findstr вместо grep.

Ну а на своей машине я сделал следующее:
echo findstr %1 %2 %3 %4 %5 > %systemroot%\grep.cmd
теперь можно не задумываясь грепать вывод:

C:\WINDOWS>netstat -an | grep LISTEN

C:\WINDOWS>findstr LISTEN
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1963 0.0.0.0:0 LISTENING
TCP 10.198.17.58:139 0.0.0.0:0 LISTENING
TCP 127.0.0.1:1025 0.0.0.0:0 LISTENING
TCP 127.0.0.1:9050 0.0.0.0:0 LISTENING
TCP 127.0.0.1:9051 0.0.0.0:0 LISTENING
TCP 192.168.56.1:139 0.0.0.0:0 LISTENING


Ну и на закуску:

ifconfig:

echo IF "%1"=="-a" (ipconfig /all) ELSE (ipconfig %1) > %systemroot%\ifconfig.cmd

man:

echo %1 /?> %systemroot%\man.cmd

ls:

echo IF "%1"=="-a" (dir) ELSE (IF "%1"=="-al" (dir) ELSE (dir %1 %2 %3 %4 %5)) > %systemroot%\ls.cmd
Я часто на автомате даю ключ(и) -a(l) команде ls, по этому добавил их «обработку»

UPD перенёс в «Системное администрирование»
BasiL @AddRemover
карма
34,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (85)

  • +3
    Дык вроде бы Power Shell уже везде работает, а в некоторых местах по умолчанию есть. А в PS этот функционал есть. ХР всё равно скоро отойдёт, судя по всему, есть смысл постепенно изучать именно Power Shell.
    • +3
      В Windows Vista, Windows 7 и Server 2008 командным интерпретатором по умолчанию остался cmd, так что топик как минимум небесполезен.
      • 0
        В таком случае согласен. Я, видимо, пропустил новость о том, что в семёрке и сервере оставили cmd.
        • 0
          Да и не было такой новости :)
          Большой новостью была бы замена cmd на PowerShell, чего я с нетерпением жду от Microsoft в следующих версиях Windows.
          • 0
            Я о том, что вроде бы планировали вводить, я и подумал, что сделали, как планировали. А оказывается всё осталось по старому.
            • 0
              PowerShell надо вызывать отдельно, но под XP работать не будет. Остальные плюшки (кроме «грепа») будут работать и под Windows 98
              • 0
                Вернее, в XP его можно поставить отдельно. Уже, кстати, есть RC 2.0
      • +1
        В Windows нет «командного интерпретатора по умолчанию».

        Есть интерпретатор, поддерживающий bat- и cmd-файлы — cmd.exe.
        Есть интерпретатор, поддерживающий ps1-файлы — PowerShell.

        Единственное место, где можно с натяжкой применить термин «командный интерпретатор по умолчанию» — это Server 2008 Core. Не уверен, по-прежнему ли используется ли в 2008 r2 Core по умолчанию cmd.exe, однако уж очень вряд ли PowerShell когда-то ассоциируют с bat-никами :)
        • +1
          %comspec% это не по умолчанию?
          • 0
            а какая разница, какой из них «по умолчанию»?
          • 0
            А кто его использует? (вопрос, если что, риторический)

            Это примерно из эры command.com :)
            • 0
              Я, правда из нативного кода. Ну и да, эта форма вызова пришла из той эры, ну и что? Не хардкодить же имя командного интерпретатора?

              А про command.com — он с нами даже в семерке :)
              • 0
                Вот для этих целей и есть ShellExecute, чтобы не хардкодить, а вызывать ассоциированный :)
                А из скриптов есть call, опять же.

                А даже если command.com и есть (судя по копирайтной строке, туда уже лет 8 никто не заглядывал), то это не значит, что его нужно использовать.
                • 0
                  Нет, вы не поняли. Не просто вызвать сценарий. Бывало приходилось генерить на лету (и при этом не хотелось писать в файл), и консоль показывать не к чему (а вместо этого перенаправить стандартные дескрипторы в именованый пайп).
                  Вобщем ShellExecute это для простых случаев.

                  comspec и подменить можно если нужно организовать какой-нибудь препроцессинг.
                  • 0
                    Ну когда ShellExecute не устраивает, то можно AssocQueryString + CreateProcess :)

                    А то ведь никто не обещает, что это 16-разрядное наследие в один прекрасный момент не прибьют.
                    • 0
                      А я вот предпочитаю ExpandEnvironmentStrings + CreateProcess. А командный интерпретатор вполне себе 32х-разрядный. Более того, ms вермя от времени добавляет новые переменные среды, значит механизм будет жив.
                      • 0
                        Не, никто ж не говорит, что переменные среды вымрут как класс.
                        Я говорил про конкретную переменную ComSpec.

                        В общем, дело вкуса :) Предлагаю на этом закончить.
        • 0
          Да ты чо? Набери команду cscript /? в любой доступной тебе «винде».
          • +3
            Угу, отрицайте очевидное — 10 лет не замечать полноценный скриптовой движок, встроенный в любую версию Windows — это постараться надо.
            • 0
              Тссс, не кормите :)
        • +1
          Вот в семёрке, к примеру, дефолтное действие на bat и cmd — запустить.
          А на ps1 — открыть нотепадом.
          И кроме того переменная pathext выставлена так:
          PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

          То есть, нельзя так же легко и свободно написать скрипт на PS и запускать его из командной строки. Без дополнительных настроек. (Командной строкой назовём Win-R)
          Нельзя и из cmd по тем же причинам.
          Ну и для пущей секурности нельзя и из powershell`а по дефолту:
          File C:\util\test.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see «get-help about_signing» for more details.

          То есть, нельзя считать cmd/bat и PS равноправными в системе.
    • 0
      grep в павершелл есть алиас на findstr -i

      а топег чо, для кого то откровение?
  • +6
    Рекомендую обратить еще внимание на SFU- Windows Services for UNIX
    • 0
      да, вещь хорошая. Однако, из коробки ее нет, да и весит прилично.
      • 0
        Да и обновлялась она очень давно.
    • –2
      авторитетные товарищи намекают что с включенным сфу и посикс-режимом виндовс ведет себя оченно странно. так что лучше в вбокс присунуть нужный юнепц-лайк или там цигвин или там чо ищо.
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    А еще ps, sync, ln, whois, du и т.п. от Sysinternals: technet.microsoft.com/en-us/sysinternals/bb545027.aspx
    • 0
      вместо ps есть tasklist ;)
      Моя цель была использовать то, что есть, а не доставить аналог.

      Надо сказать, настоящий grep я тоже использую, т.к. его производительность в разы больше, чем у findstr. Но это исключение, а не правило.
  • +1
    Во многих случаях удобнее ack: betterthangrep.com/
    по умолчанию ищет рекурсивно, знает о «проектах» (svn/mercurial/git), подсвечивает, и множество других отличий
  • 0
    Такс, часто приходится в командной строке виндовой сидеть, но к сожалению сам эмулятор терминала оставляет желать лучшего, ни табов, ни профилей, ни даже нормальной работы с буфером обмена. Короче когда надо что-то быстренько то сгодится, а когда приходится по многу орудовать то тоскливо становится. Пробовал console2, ещё какую то утилиту, но первая оказалось зело глючной в плане установке переменных окружения, а вторая тупо триальной. Была надежда, что заведется виндовый порт konsole, и что ещё круче yakuake, но к сожалению они пока совсем не готовы. Поэтому в ожидании, когда их наконец допилят, нужна какая то бесплатная замена.
    Требования очень простые.
    1.Табы
    2.Удобное создание профилей с различными переменными окружения
    3.Нормальная работа с буфером обмена и автодополнением
    Идеалом является konsole, ежели кто знает чего подобное под Винду буду очень признателен
    • 0
      1. PowerShell ISE
      2. FAR с плагинами
      • 0
        У фара кстати есть один недостаток, он же в обычном cmd.exe запускается и его нельзя на весь экран растягивать? Или уже можно?
        А насчет первого я так понял там нету интерактивного режима, или уже есть?
        • 0
          У него недостатков гораздо больше.
          Хотя бы тот факт, что консоль не поддерживает весь юникод.
          • 0
            Вроде же та подсистема, которая отвечает за командную строку уже столет в обед юникодная, а старые кодировки просто по умолчанию включены для обратной совместимости? Или меня обманули?
            • 0
              Меня терзают смутные сомненья, что хоть один поддерживаемый консолью шрифт нормально отобразит, например, одновременно кириллицу и иероглифы. Но большинство юникодных символов тот же Consolas поддерживает, надо отдать ему должное.
              • 0
                Дык посмотрите как никсовые графические эмуляторы терминала сделаны, там вообще любые шрифты можно вешать ибо поле ввода — обычный текстовый браузер аля блокнот, но естественно лучше всего будут смотрется консольные, так как их специально затачивали под это дело. Таким же образом работает виндовая console2, по сути нам остается получить от командной строки вывод, распарсить его и выводить каким угодно красивым образом.
        • 0
          При чем тут cmd.exe? Сам по себе он запускается, хоть из explorer, хоть из автозапуска
          • 0
            Мне всю жизнь казалось, что он так или иначе cmd.exe пользует ибо содержит тяжелое WinDOSовское наследие (соответственно серии win 9x и dos 7.22).
            Хотя реально я им последний раз году в 2004 пользовался, но брат его хвалил и говорил, что после того, как он стал опенсорсным, там произошло много приятных изменений.
            Но я лично после юзания никсовых эмуляторов терминалов с табами охладел к двухпанельникам
            • 0
              А мне всю жизнь казалось что все консольные приложения смахивают под дос и им совершенно не нужно для этого использовать cmd, который тоже консольный и этим похож на них всех.
        • 0
          есть ConEmu для него
        • 0
          Alt+F9 в фаре
    • 0
      Пробовал console2, ещё какую то утилиту, но первая оказалось зело глючной в плане установке переменных окружения
      Console2 ведь просто запускает cmd.exe, перехватывает ввод/вывод и прячет окошко, вряд ли проблема с окружением из-за Console2.
  • +2
    есть GNU Coreutils for Windows
  • +6
    убило: echo %1 /?> %systemroot%\man.cmd
    предлагаю еще: ren far.exe mc.exe
    • +1
      это все от того, что я постоянно забываю синтаксис for, и на автомате набираю man for, а не for /?
  • +5
    Долгое время использую GNU utilities for Win32
    • +1
      Гораздо удобней предложенного в топике.
  • +1
    Если на машине установлен Perl, то можно еще заюзать удобную утилиту ack.
  • +3
    Знаете, насчет всяких никсовых утилит повершеллов и тд.
    Мне однажды нужно было написать скрипт, который бы вызывался после закрытия проги и подчищал все следы её апдейта, ибо в винде же нельзя перезаписывать файлы, открытые на чтение. Поэтому приходится вначале переименовывать файлы, потом накатывать на их место обновлённые, а затем по выходу из проги пускать скрипт очищальщик. Но к сожалению скрипт успевал начать работать раньше, чем прога до конца освободит ресурсы. То есть нужен был wait, какого же было мое удивление, когда я не нашел готовой функции wait или sleep. А скрипт должен был работать на любой голой винде NT семейства, изобретать велосипед/просить ставить нечто дополнительное в систему мне не хотелось.
    Пришлось в итоге полагаться на великую утилиту ping, и пинговать ей локалхост.
    ping -n 5 localhost > nul
    Эта команда дает задержку в 5 секунд и работает вообще на любой винде
    • +1
      Рекомендую habrahabr.ru/blogs/crazydev/62043/
      • 0
        Отличная заметка, спасибо. Рисовать картинки с консольки… Это действительно, ненормальное программирование ;)
    • 0
      Да, нет такой команды :(
      пинг локалхоста тоже постоянно использую, как то гугл подсказал, сам бы не додумался.
  • +1
    Под винду еще есть WinGrep, тоже удобная вещица:
    www.wingrep.com/index.htm
  • 0
    Windows script Host дожил уж до версии 5.7, существует последние 10 лет для любой версии Windows, начиная с 95, имеет два языка на выбор по умолчанию, есть просто везде!

    Какая мораль у этой истории?
    • +2
      Плюс позволяет создавать com-based объекты для доступа из скриптов, чем кошерен.
    • 0
      к сожалению, я не знаю ни одного языка для использования в WSH.
      По этому топик был для тех, кто использует cmd.
    • 0
      А в нем уже интерактивный шелл появился? )
      • 0
        Для интерактивного режима там слишком многословные языки. Интерактив через мышку.
        • 0
          Это я про нерелевантность вашего коммента к топику.
          • –1
            Если хотя бы одним строителем велосипедов станет меньше, он был не зря.
    • 0
      Мораль простая. Судя по продвижению PowerShell Microsoft осознала, что с WSH у неё не получилось и решила попробовать ещё раз. Новая попытка удачнее старой.
      • 0
        WSH для скриптов и вполне себе получился (на нем даже можно COM объекты писать). PoSh — это шелл. Это разные ниши — как питон и какой-нибудь zsh. Место WSH занял скорее всего .NET + DLR
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    Сперва юзал grep от Борланда, потом поставил cygwin.
  • +1
    Hint: вместо %1 %2 %3 %4 %5 есть %*
    • 0
      Спасибо, не знал
  • 0
    госпаде… сейчас в вин7 запустил павершелл. такое же тормозное убожество. в нем нереально работать. :( хотя, конечно, цмд такое же убожество, хоть и со скоростью у него все впорядке. :(
    • 0
      Я как-то работаю. Возможно нереально. Может тормозное убожество это то, на чем его запускают?
      • +2
        Нет. Возможно, у всех разные представления о тормозности. В наш век дот-нета, инсталляторов а-ля MSI и прочих «сверхпроизводительных» решений становится само собой подразумевающимся, что тормоза — это нормально и неизбежно.

        Лично для меня, например, PowerShell тоже выглядит слишком тормозным, чтобы в нём можно было комфортно работать. Наверное, просто потому что у меня устаревшие представления о программах, потому что я привык к лучшему. К IrfanView, инсталлятор которого выполняет установку не за три минуты, а за две секунды. К Everything, который за секунду умудряется выбрать и отобразить содержимое полумиллионной базы записей. К Опере, которая при переходе по истории страниц мгновенно отображает их из кэша. К EmEditor, который без тормозов работает со стамегабайтными файлами.
        • 0
          Наверное, вы пишете этот пост из links?
          • +1
            Если бы links обладал всеми теми же функциями, что и нормальные браузеры, и при этом работал бы так же быстро, как сейчас, то писал бы из него.

            Я, наверное, вас шокирую, но должен признаться (только тссс!), я пользуюсь ещё и такими программами как The Bat!, GIMP и даже (о, ужас!) OpenOffice.org. Отсутствие высокопроизводительных альтернатив, обладающих необходимым функционалом, вынуждает пользоваться тормозными инструментами, но от этого они не перестают быть тормозными, как ни странно. Если бы у меня была такая необходимость, я бы пользовался и PowerShell'ом, но моё мнение о его тормознутости от этого не поменялось бы.
            • 0
              Мне кажется, для того, чтобы судить о тормознутости, надо сравнивать программы с одинаковым функционалом или хотя бы построенные на одинаковых принципах. Например с объектным PowerShell надо сравнивать какой-нибудь другой обхектный шелл, а не «текстовое убожество» :)
              • 0
                Сравнивать схожие программы нужно, если хочется сравнить тормознутость. А чтобы судить о тормознутости, этого совершенно не требуется. Если я запускаю некую абстрактную программу и она выводит мне своё окно лишь через десять секунд, — это тормознутость. Если я жму клавишу, а символ появляется только через какое-то ощутимое время, — это тормознутость. Если я щёлкаю мышью, а программа реагирует только через несколько секунд, — это тормознутость. И совершенно неважно, каковы причины всех этих тормознутостей, обоснованы ли они, есть ли более быстрые аналоги или нет их, можно ли написать более эффективную реализацию или это принципиально невозможно, — всё это вторично. Независимо от всего этого программа субъективно тормозит, и, как следствие, пользоваться ей некомфортно.
                • 0
                  К PoSh относится время первого запуска или все остальное тоже?
                  У вас тормознутая операционная система?
                  Сколько времени она запускается?
                  • 0
                    К PoSh относится время первого запуска или все остальное тоже?
                    Точно уже не помню, давно было. Помню, что работать в PowerShell было некомфортно из-за низкой скорости работы программы, я и выкинул её из головы и с компьютера, благо необходимости в ней не было, ставил только из интереса. Ставить ещё раз только ради того, чтобы сказать, что именно там тормозит, я не буду.
                    У вас тормознутая операционная система?
                    В некоторых аспектах — да, в некоторых — нет.
                    Сколько времени она запускается?
                    С секундомером никогда не засекал, но довольно долго (минуту, две, где-то так).
                • 0
                  Имхо, правильный ответ про тормознутость — это многократно более длительное выполнение некоей используемой функции некоей программой по сравнению с возможным временем выполнения данной операции приложением для неё оптимизированным.

                  задержка в появление символов в редакторе не оправдывается наличием проверки орфографии.
                  медленная фильтрация ala grep не оправдывается возможностью создавать ком.объекты
      • +2
        с каких пор 4-х ядерный коредуо с 8ГБ памяти оцененный семеркой далеко не на мелкую оценку (гораздо больше 5 баллов) является тормозным убожеством?

        какбе все остальное натуральным образом «летает», впрочем на висте тоже все летало, но на семерке стало сверхзвуковым.

        ведь очень странно когда жалкий павершелл только запускается полминут, когда все остальное рядом даже не думает тормозить :(

        я понимаю что павершелл написан на дотнете и априори не может работать быстро. но если так, зачем ж его позиционировать заменой сверхзвуковым шеллам самизнаетегде? знаете ли после zsh такое слегка раздражает и не может считаться _аналогичным_ инструментом.
        • 0
          думаю, что Microsoft — со временм доработает powershell.
          И он тоже будет летать.
          Кроме того на technet есть доки, как его ускорить в тех местах, где он тормозит(и его запуск в том числе)
        • 0
          1. После старта лично мне работать в нем комфортно
          2. Второй старт гораздо быстрее первого
          3. blog.lab49.com/archives/288
          4. Конечно, нельзя считать PoSh аналогом zsh, оперу аналогом links а word 2010 аналогом word 2 for DOS. И не только из за скорости выполнения — возможности несколько другие.
          • 0
            божежмой. вы предлагаете прежде чем сесть работать в павершелле несколько раз его перезагрузить чтоб он стал побыстрее? ну почему же нельзя щитать аналогом zsh, разве не из-за него и ему подобных был придуман вообще павершелл, разве не затем в нем куча функций чем-то напоминающие отчасти бинутилс. по мне так прямой аналог. ведь когда говорят «в виндовсе нет нормального терминала» в ответ виндузятники тыкают павершеллом. я очень верю что они в них работают и пишут скрипты на всш и вообще все такие молодцы. но это просто все сродни с мазозизмом.

            насчет ваших сравнений, не передергивайте и не играйте словами. так можно докатиться до сравнение бубунты с виндовс 3.11 и с пеной у рта доказывать что бубунту лучше виндовса.

            по части вашей ссылки, да, но коренным образом он ничего не меняет, а именно того что павершелл унылое тормозное гавно. возможно когда там, в микрасофте, одумаются, перестанут на дотнете писать нанооперационныесистемы и снимут розовые очки, то снизайдут до простых смертных и напишут нормальный шустрый шелл. хотя конечно вопрос «а нужен ли вообще шелл в виндовс останется открыт»
            • 0
              божежмой. вы предлагаете прежде чем сесть работать в павершелле несколько раз его перезагрузить чтоб он стал побыстрее?


              Если цель — насладиться именно временем старта, то да. Если цель наоборот, сказать что он тормознутый — то продолжайте перезагружаться после каждого запуска. Я запускаю ISE 1 раз за сеанс и из него не выхожу. Асинхронность и и табы мне это позволяют. Кстати, в ISE есть редактор c регекспами, и весь ISE включая редактор скриптуются на PoSh

              ну почему же нельзя щитать аналогом zsh, разве не из-за него и ему подобных был придуман вообще павершелл, разве не затем в нем куча функций чем-то напоминающие отчасти бинутилс. по мне так прямой аналог.

              По мне, так вы не просекли основную фишку павершелл.

              Безусловно объектный шелл похож на текстовый — между notepad и word тоже есть какие-то общие черты.

              Проиллюстрировать разницу можно простой командой

              gsv *sql* | sort Status | ft -gr Status

              здесь
              gsv *sql* — получает поток объектов типа «сервис» в имени которых есть символы sql
              sort Status — получает от предыдущей команды поток объектов и сортирует по свойству Status
              ft -gr Status — форматирует выхлоп предыдущей команды в виде таблицы, группируя по полу статус идущие подряд объекты с одинаковым статусом

              Типа
                 Status: Stopped
              
              Status   Name               DisplayName                           
              ------   ----               -----------                           
              Stopped  SQLBrowser         SQL Server Browser                    
              Stopped  SQLAgent$AXMSDE001 SQLAgent$AXMSDE001                    
              
                 Status: Running
              
              Status   Name               DisplayName                           
              ------   ----               -----------                           
              Running  MSSQL$AXMSDE001    MSSQL$AXMSDE001                       
              
              


              Так как везде передаются объекты командам не надо дополнительно объяснять, как парсить выхлоп друг друга. Плюс еще благодаря интеграции с .NET есть огромнейшие возможности для расширения (например, можно ходить по базам SQL server как по папкам виртуальной файловой системы)

              Или вот еще пример из хелпа:

              $zip = New-WebServiceProxy -uri www.webservicex.net/uszip.asmx?WSDL
              $zip.getinfobyzip(20500).table

              CITY: Washington
              STATE: DC
              ZIP: 20500
              AREA_CODE: 202
              TIME_ZONE: E

              В-общем, я готов согласиться, что PowerShell медленнее текстовых шеллов, но он не уныл и не говно.

  • –1
    ну, знаете ли, через ActiveX в винде файловую систему можно пристыковать почти к любому месте. А потом писать на любимом (=Javascript) языке любые утилиты (используя IE как интерфейс).
    Скрипты — это конечно хорошо. Но на один раз. Если нужно «рабочее место» развернуть, то тут нужна какая-то оболочка.
  • 0
    Хм…
    grep.exe — 124416 байт.

    Usage: grep [OPTION]... PATTERN [FILE] ...
    Search for PATTERN in each FILE or standard input.
    
    • 0
      мои скрипты должны работать на любой (ну, или почти на любой) Windows, так как же быть?


      Вообще цель топика была показать, что вместо грепа УЖЕ ЕСТЬ findstr -i

      То, что есть масса альтернатив под вин, и тот же сигвин, мне тоже известно, о чем я написал в самом начале топика.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.