findstr как замена grep-у
На днях пришлось копать текстовый файл (архив лога в текстовом формате) на предмет активности некоторых пользователей в энный период времени пол года назад.
Первое что пришло в голову – загрузить для последующего анализа этот «файлик» на 70 гигов в архиве, затем распаковать его на одном из ликунсовых хостов и прочистить его grep-ом.
Первая мысль оказалась удачной, но тут же вспомнилась несправедливо забываемая стандартная утилита findstr.
Вот список её возможностей:
- сравнить с шаблоном
- поиск строки
- использовать для поиска регулярное выражение
- искать можно независимо от регистра
и еще много чего полезного.
Для примера возьмем произвольный файл и начнем в нем поиск.
в файле 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. |
А также бесплатно подписаться по E-mail и получать актуальную информацию в числе первых.
Вы можете оставить комментарий.
Здравствуйте!
У меня вопрос по findstr. По какой причине эта команда не ищет в текстовом файле слово или выражение в кириллице? Если образец поиска в латинице, то скрипт работает.
Заранее спасибо за ответ.
userЦитировать
Традиционно все файлы идут в CP1251, а findstr.exe работает только с кодировкой CP866.
Можно изобразить некоторое, извиняюсь, извращение
1. при помощи ICONV http://gnuwin32.sourceforge.net/packages/libiconv.htm создать временный файл в нужной кодировке
2. пропарсить его через findstr
adminЦитировать
Спасибо. Я догадывался, что дело в кодировке, и что, если ее как-то изменить, то findstr будет работать.
НО, если я Вас правильно понял, Вы предлагаете установить прогу, в которой можно поменять кодировку? Мне не подходит этот вариант. Если уж необходимо менять кодировку файла, то мне нужно это делать с помощью этого же скрипта, например, в тот же временный файл, а уж потом в нем искать. Дело в том, что эту операцию поиска придется производить периодически и искать в сотнях файлов (я это хотел сделать в цикле). Вот… Есть ли какая-то команда, которая бы изменяла кодировку?
userЦитировать
не предлагаю а привожу совершенно утопический вариант.
Findstr очень удобно использовать для парсинга логов и пр, но полноценно на нем искать не получится т.к. инструмент изначально писался не для этого.
adminЦитировать
Ваш ответ (про кодировку 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)
userЦитировать
по виду вполне работоспособно.
На мой взгляд проще использовать powershell т.к. там это делается вообще в одну строку.
http://technet.microsoft.com/ru-ru/library/dd315403.aspx
adminЦитировать
Здравствуйте!
Спасибо за подсказку. Установил PowerShell, попробую разобраться, что это за зверь. Но поиск текста в кириллице уж проверил – работает, если искать в файле с кодировкой UTF8!!!
Спасибо!
userЦитировать