Как в powershell найти строку
Перейти к содержимому

Как в powershell найти строку

Select-String

Командлет Select-String осуществляет поиск текста и текстовых шаблонов во входных строках и файлах. Его можно использовать, как команду Grep в UNIX и Findstr в Windows.

Работа командлета Select-String основана на текстовых строках. По умолчанию Select-String находит первое совпадение в каждой строке и отображает для каждого совпадения имя файла, номер строки и полный текст найденной строки.

Однако можно сделать так, чтобы командлет искал несколько совпадений в строке, выводил текст до и после совпадения или выводил только логическое значение (true или false), указывающее, было ли найдено совпадение.

Командлет Select-String использует поиск по регулярным выражениям, но он также позволяет находить простые совпадения, выполняя поиск введенного фрагмента текста.

Командлет Select-String может выводить все найденные совпадения или останавливаться после первого совпадения для каждого входного файла. Кроме того, он может выводить весь текст, который не соответствует заданному шаблону.

Можно также установить для командлета Select-String конкретную кодировку, например при поиске по файлам в кодировке Юникод.

Параметры

-AllMatches

Выполняет поиск более одного совпадения в каждой из текстовых строк. Без этого параметра командлет Select-String находит только первое совпадение в каждой из текстовых строк.

Найдя в текстовой строке несколько совпадений, Select-String все равно возвращает для нее только один объект MatchInfo, однако свойство Matches для этой строки содержит все совпадения.

Значение по умолчанию

Принимать входные данные из конвейера?

Принимать подстановочные знаки?

-CaseSensitive

Сопоставление учитывает регистр. По умолчанию сопоставление выполняется без учета регистра.

Значение по умолчанию

Принимать входные данные из конвейера?

Принимать подстановочные знаки?

-Context <Int32[]>

Записывает заданное число строк до и после строки с совпадением. Это позволяет видеть совпадение в контексте.

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

По умолчанию строки с совпадением помечаются правой угловой скобкой (код ASCII 62) в первом отображаемом столбце. Непомеченные строки формируют контекст.

Этот параметр не изменяет числа объектов, создаваемых командлетом Select-String. Select-String создает один объект MatchInfo (Microsoft.PowerShell.Commands.MatchInfo) для каждого совпадения. Контекст сохраняется в массиве строк в свойстве Context объекта.

При передаче результата выполнения команды Select-String другой команде Select-String по конвейеру принимающая команда ищет текст только в строке с совпадением (значении свойства Line объекта MatchInfo), но не в тексте строк контекста. В результате параметр Context не учитывается принимающей командой Select-String.

Если контекст включает совпадение, то объект MatchInfo для каждого совпадения включает все строки контекста, общие строки выводятся на экран только один раз.

Значение по умолчанию

Принимать входные данные из конвейера?

Принимать подстановочные знаки?

-Кодирование <string>

Задает предположительную кодировку файла, по которому должен осуществляться поиск с помощью командлета Select-String. По умолчанию используется значение UTF8.

Допустимые значения: «UTF7», «UTF8», «UTF32», «ASCII», «Unicode», «BigEndianUnicode», «Default» и «OEM». Значение Default соответствует кодировке текущей системной кодовой страницы ANSI. OEM соответствует идентификатору кодовой страницы текущего изготовителя оборудования для операционной системы.

Значение по умолчанию

Принимать входные данные из конвейера?

Принимать подстановочные знаки?

-Exclude <string[]>

Исключает указанные элементы. Значение этого параметра определяет значение параметра Path. Введите элемент пути или шаблон, например «*.txt». Подстановочные знаки разрешены.

Значение по умолчанию

Принимать входные данные из конвейера?

Принимать подстановочные знаки?

-Include <string[]>

Включает только указанные элементы. Значение этого параметра определяет значение параметра Path. Введите элемент пути или шаблон, например «*.txt». Подстановочные знаки разрешены.

Значение по умолчанию

Принимать входные данные из конвейера?

Принимать подстановочные знаки?

-InputObject <psobject>

Задает текст для поиска. Укажите переменную, содержащую текст, либо введите команду или выражение, получающие его.

Значение по умолчанию

Принимать входные данные из конвейера?

Принимать подстановочные знаки?

Возвращает только первое совпадение для каждого из входных файлов. По умолчанию командлет Select-String возвращает объект MatchInfo для каждого найденного совпадения.

Значение по умолчанию

Принимать входные данные из конвейера?

Принимать подстановочные знаки?

-NotMatch

Находит текст, который не соответствует заданному шаблону.

Значение по умолчанию

Принимать входные данные из конвейера?

Принимать подстановочные знаки?

-Path <string[]>

Задает путь к файлам для поиска. Подстановочные знаки разрешены. Местоположением по умолчанию является локальный каталог.

Укажите файлы в каталоге, например «log1.txt», «*.doc» или «*.*». Если указать только каталог, команда завершится сбоем.

Значение по умолчанию

Принимать входные данные из конвейера?

Принимать подстановочные знаки?

-Pattern <string[]>

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

Дополнительные сведения о регулярных выражениях см. about_Regular_Expressions.

Значение по умолчанию

Принимать входные данные из конвейера?

Принимать подстановочные знаки?

-Quiet

Возвращает логическое значение (true или false) вместо объекта MatchInfo. Значение будет равно «true», если найдено соответствие шаблону, в противном случае — «false».

Значение по умолчанию

Принимать входные данные из конвейера?

Принимать подстановочные знаки?

-SimpleMatch

Вместо сопоставления по регулярному выражению будет использоваться простое сопоставление. При простом сопоставлении командлет Select-String ищет во входных данных текст, указанный в параметре Pattern. Он не интерпретирует значение параметра Pattern в качестве регулярного выражения.

Значение по умолчанию

Принимать входные данные из конвейера?

Принимать подстановочные знаки?

<CommonParameters>

Данный командлет поддерживает общие параметры -Verbose, -Debug, -ErrorAction, -ErrorVariable, -OutBuffer и -OutVariable. Дополнительные сведения см. в разделе about_Commonparameters.

Ввод и вывод

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

Любой объект, содержащий метод ToString, можно передать командлету Select-String по конвейеру.

Microsoft.PowerShell.Commands.MatchInfo or System.Boolean

По умолчанию вывод состоит из объектов MatchInfo — по одному на каждое совпадение. При использовании параметра Quiet возвращается логическое значение, указывающее, найден ли шаблон.

Примечания

Командлет Select-String похож на команду Grep в UNIX и FindStr в Windows.

Для использования командлета Select-String в качестве значения параметра Pattern необходимо ввести текст, который требуется найти.

Для задания текста для поиска выполните следующее.

— Введите текст в виде заключенной в кавычки строки и передайте его командлету Select-String по конвейеру.

— Сохраните текстовую строку в переменной и укажите эту переменную в качестве значения параметра InputObject.

— Если текст хранится в файлах, укажите путь к этим файлам с помощью параметра Path.

По умолчанию командлет Select-String интерпретирует значение параметра Pattern в качестве регулярного выражения. (Дополнительные сведения см. about_Regular_Expressions.) Однако с помощью параметра SimpleMatch можно отключить сопоставление с использованием регулярных выражений. Параметр SimpleMatch ищет во входных данных экземпляры значения параметра Pattern.

По умолчанию выводом командлета Select-String является объект MatchInfo, который включает подробные сведения о совпадениях. Сведения, которые содержатся в этом объекте, бывают полезными при поиске текста в файлах, поскольку у объекта MatchInfo имеются такие свойства, как Filename и Line. Если входные данные не являются файлом, эти параметры имеют значение InputStream.

Если выводить сведения, содержащиеся в объекте MatchInfo, не требуется, можно использовать параметр Quiet, возвращающий значение типа Boolean (true или false), которое вместо объекта MatchInfo показывает, было ли найдено совпадение.

При сопоставлении фраз командлет Select-String использует текущую, заданную для системы. Чтобы определить текущие региональные параметры, используйте командлет Get-Culture.

Powershell. Поиск в тексте

Использовать командлет Select-String можно разными способами. Например подавать содержимое файлов через конвейер:

Но лучше указывать объект с данными в виде аргумента InputObject, так как это выполняется гораздо быстрее:

В поисках производительности

Если замерить скорость выполнения этой команды, то она будет крайне не высокой:

Указывая список файлов в виде аргумента для Select-String мы получим значительный прирост скорости поиска:

Workflow

Так же попробовал несколько вариантов использования Select-String в Workflow.
Сначала вариант с циклом:

На удивление, никакого прироста скорости поиска я не получил, даже увеличивая значение «-throttlelimit»

Самым быстрый вариант

Здесь в блоке parallel мы, используя InlineScript, заносим результат Select-String в массив

Не могу объяснить за счет чего именно достигается увеличение скорости поиска, тем не менее, при необходимости найти документ или строки в большом объеме данных, можно использовать эту конструкцию.
Можно искать по всем дискам компьютера, или же и вовсе по списку компьютеров.
Думаю в этом случае мы получим прирост по времени, значительно больший чем 3 секунды

GREP в PowerShell: Поиск текста в файле с Select-String

date02.09.2021
useritpro
directoryPowerShell, Windows 10, Windows Server 2019
commentsкомментария 4

В мире Linux/Unix для поиска определенного текста или ошибок в лог файлах используется команда grep. Grep позволяет быстро и удобно найти/выбрать любых данные из результатов выполнения другой команды:

command | grep search

В PowerShell для поиска текста в файлах можно использовать командлет Select-String.

Например, следующая команда выведет все строки текстового файла, содержащие ключевую фразу ERROR:

Select-String -Path c:\tmp\makeapp_sxtracesxs.txt -Pattern «ERROR»

select-string поиск строки в файле с помощью PowerShell

Команда вывела номера строк, в которых содержится искомый тескт и их содержимое.

Если вам нужно выполнить поиск вхождения строки по всем txt файлам в определенном каталоге, выполните команду:

Select-String -Path c:\tmp\*.txt -Pattern «ERROR»

Такую команду удоно исопльзовать, если нужно выполнить поиск по всем файлам в каталоге. Например, для поиска в транспортных логах/smtp Exchange.

С помощью опций Exclude/Include можно включить, исключить определенннные файлы для поиска. Следующий пример выполнит поиск по всем txt и log файлам, имя которых не содежит copy:
$path = «c:\tmp\*»
Select-String -Path $path -Pattern «ERROR» -Include «*.txt»,»*.log» -Exclude «*copy*»

Предудущий пример выполняет поиск текста только в указанном каталоге. Для рекурсивного поиска по файлам во вложенных каталогах используйте Get-ChildItem:

Get-ChildItem -Path ‘c:\tmp\’ -Recurse -include «*.mp3″,»*.avi» -ErrorAction SilentlyContinue | Select-String -SimpleMatch «ERROR»,»WARNING»

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *