findstr как замена grep-у

На днях пришлось копать текстовый файл (архив лога в текстовом формате) на предмет активности некоторых пользователей в энный период времени пол года назад.

Первое что пришло в голову – загрузить для последующего анализа этот «файлик» на 70 гигов в архиве, затем распаковать его на одном из ликунсовых хостов и прочистить его grep-ом.

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

Вот список её возможностей:

  1. сравнить с шаблоном
  2. поиск строки
  3. использовать для поиска регулярное выражение
  4. искать можно независимо от регистра

и еще много чего полезного.

Для примера возьмем произвольный файл и начнем в нем поиск.

в файле file.txt ищем строку содержащую test0001

findstr test0001 file.txt

в файле file.txt ищем строку содержащую выражение user1 test

findstr /c:"user1 test" file.txt

ищем без учета регистра во всех файлах текущего каталога слово example

findstr /s /i example *.*

выбрать из всех лог файлов строки которые не содержат в себе выражения lab.user01

findstr /s /v lab.user01 *.log > result.txt

Если мы разбираем лог-файл IIS-а на предмет запрошенных файлов то вводим

type logfile01.log | findstr "file="

Если необходимо получить список запросов несуществующих файлов (ошибка 404) то вводим

type logfile01.log | findstr "404"

Для удобства есть опции /n и /m и их можно использовать для того что бы получить строку в которой находится искомое выражение или список имен файлов в которых есть выражение.

Если необходимо найти по началу строки то в строке поиска используем

findstr /s /i "\<192.168.1.*" *.*

получаем всех кто обращался из указанной подсети.

И в завершении…
Для того что бы определить какие порты открыты на нашей системе пишем

netstat -an | findstr 0.0.0.0

Информация об авторе

Сергей Мариничев.
Вы можете присоединиться ко мне в Facebook или в Twitter.

Если Вам понравилась статья, то вы можете подписаться на RSS.
А также бесплатно подписаться по E-mail и получать актуальную информацию в числе первых.

Получать обновления на email

Вы можете оставить комментарий.

7 Комментариев »

 
  • 1# user (6 комм.):

    Здравствуйте!

    У меня вопрос по findstr. По какой причине эта команда не ищет в текстовом файле слово или выражение в кириллице? Если образец поиска в латинице, то скрипт работает.
    Заранее спасибо за ответ.

      Цитировать

    • 2# admin (36 комм.):

      Традиционно все файлы идут в CP1251, а findstr.exe работает только с кодировкой CP866.

      Можно изобразить некоторое, извиняюсь, извращение
      1. при помощи ICONV http://gnuwin32.sourceforge.net/packages/libiconv.htm создать временный файл в нужной кодировке
      2. пропарсить его через findstr

        Цитировать

      • 3# user (6 комм.):

        Спасибо. Я догадывался, что дело в кодировке, и что, если ее как-то изменить, то findstr будет работать.
        НО, если я Вас правильно понял, Вы предлагаете установить прогу, в которой можно поменять кодировку? Мне не подходит этот вариант. Если уж необходимо менять кодировку файла, то мне нужно это делать с помощью этого же скрипта, например, в тот же временный файл, а уж потом в нем искать. Дело в том, что эту операцию поиска придется производить периодически и искать в сотнях файлов (я это хотел сделать в цикле). Вот… Есть ли какая-то команда, которая бы изменяла кодировку?

          Цитировать

      • 4# admin (36 комм.):

        не предлагаю а привожу совершенно утопический вариант.

        Findstr очень удобно использовать для парсинга логов и пр, но полноценно на нем искать не получится т.к. инструмент изначально писался не для этого.

          Цитировать

      • 5# user (6 комм.):

        Ваш ответ (про кодировку UTF8) натолкнул поискать в нете готовое решение. Нашел:
        Set ADODBStream = CreateObject(«ADODB.Stream»)
        ADODBStream.Type = 2
        ADODBStream.Charset = «windows-1251″
        ADODBStream.Open()
        ADODBStream.LoadFromFile(«C:\Temp\test.txt»)
        Text = ADODBStream.ReadText()
        ADODBStream.Close()
        ADODBStream.Charset = «UTF-8″
        ADODBStream.Open()
        ADODBStream.WriteText(Text)
        ADODBStream.SaveToFile «C:\Temp\test1.txt», 2
        ADODBStream.Close()

        Файл создается в UTF8, но в нем все равно не ищется кириллица… Может я что-то не так делаю? вот скрипт, которым я ищу слово в кириллице в файле, который уже в UTF8:

        source = «C:\Temp\test1.txt»
        temp_destination = «C:\Temp\temp.txt»
        str = «система»
        f= «findstr /c:» & str & » » & source & «> » & temp_destination

        Set WshShell = CreateObject(«WScript.Shell»)
        RetCode = WshShell.run(«%comspec% /c » & f,3,True)

          Цитировать

      • 6# admin (36 комм.):

        по виду вполне работоспособно.

        На мой взгляд проще использовать powershell т.к. там это делается вообще в одну строку.

        http://technet.microsoft.com/ru-ru/library/dd315403.aspx

          Цитировать

      • 7# user (6 комм.):

        Здравствуйте!
        Спасибо за подсказку. Установил PowerShell, попробую разобраться, что это за зверь. Но поиск текста в кириллице уж проверил – работает, если искать в файле с кодировкой UTF8!!!
        Спасибо!

          Цитировать

 

Добавить комментарий

XHTML: Вы можете использовать тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>