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

от admin

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

02.09.2021
useritpro
directoryPowerShell, Windows 10, Windows Server 2019
commentsкомментариев 15

В мире 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»

Предыдущая статьяПредыдущая статья Следующая статья Следующая статья

Работа со строками в PowerShell

Результатом работы команды в PowerShell всегда является не текст, а объект. Это касается и работы с текстом. Каждая строка является отдельным объектом со своими свойствами и методами, которыми можно пользоваться для обработки текста.

Для примера создадим переменную, в которую поместим строку, а затем выведем ее свойства и методы:

$string = ″My name is Kirill″
$string | Get-Member

свойства и методы строки

Свойства

Начнем со свойств, которых у строки оказалось немного — всего два. Свойство Length содержит длину строки, или количество символов:

А свойство Chars позволяет обращаться к любому символу в строке по его номеру, например:

свойства строки

Кстати, к символам в строке можно обращаться без использования Chars, а как к элементам массива, по индексу:

А если указать отрицательное число, то массив будет перебираться с конца:

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

обращение к элементам строки

Методы

Теперь возьмем строку и начнем над ней издеваться приступим к методам.

Метод Insert служит для вставки подстроки в исходную строку, начиная с указанного символа. Для примера вставим ″ .N″ в конец строки (после 17 символа):

Метод Remove удаляет символы из строки начиная с указанного символа, например:

Метод Replace находит в исходной строке подстроку и заменяет ее на другую, например:

методы insert, remove и replace

Метод Split разбивает строку на массив строк с помощью разделяющего символа или группы символов. Например так мы разобьем строку, используя в качестве разделителя пробел:

А так укажем в качестве разделителя букву е:

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

метод split

Метод Substring позволяет получить подстроку, сформированную из исходной строки. Есть два варианта использования этого метода. К примеру результатом выполнения следующей команды будет строка, полученная путем удаления из исходной строки заданного количества символов:

А таким способом мы получим подстроку, сформированную из исходной строки, начинающуюся с указанной позиции (8) и содержащую указанное количество символов (9):

метод substring

Метод Clone создает точную копию исходного объекта, например:

Метод CompareTo производит сравнение двух строк и выдает 0, если строки совпадают:

В случае несовпадения метод может выдать -1 (если первая строка больше второй) или 1 (если первая строка меньше второй). Также при использовании этого метода стоит учитывать, что регистр символов влияет на результат сравнения. Если необходимо сравнить строки без учета регистра, то можно воспользоваться статическим методом Compare, о котором чуть позже.

Метод Equals также сравнивает две строки и в зависимости от результата возвращает True или False:

Кстати, такой же результат получается при использовании оператора сравнения -eq:

$string -eq $string2

методы clone, compareto и equals

Метод Contains проверяет наличие в строке указанной подстроки, и в зависимости от результата возвращает True или False. Например:

Метод StartsWith проверяет, начинается ли строка с указанной подстроки:

а метод EndsWith проверяет, заканчивается ли исходная строка подстрокой:

Обратите внимание, что эти методы также чувствительны к регистру символов.

методы contains, startwith, endwith

Говоря о зависимости от регистра символов, стоит упомянуть еще два метода. Метод ToUpper переводит исходную строку в верхний регистр:

а метод ToLower соответственно в нижний:

методы toupper и tolower

С их помощью можно избавиться от регистрозависимости, например при поиске или сравнении:

избавление от регистрозависимости

Метод IndexOf находит индекс начала вхождения подстроки в исходной строке. Например, создадим строковую переменную:

$string = ″substring one, substring two, substring three″

Теперь выведем индекс начала вхождения подстроки (substring):

Как видите, метод выдал 0 — это номер первого символа ( s ubstring one, substring two, substring three) в исходной строке.

Метод LastIndexOf показывает индекс последнего вхождения подстроки, т.е. номер начала последнего вхождения указанной подстроки в исходной строке. Например, следующая команда выдаст 30 — номер последнего символа (substring one, substring two, s ubstring three) в строке:

методы indexof и lastindexof

Метод IndexOfAny возвращает первое, а метод LastIndexOfAny — последнее вхождение любого символа из подстроки в исходной строке. Например:

Эта команда, как и в случае с IndexOf выдаст 0 — номер первого символа (s) в строке. А так мы получим 42 — номер последнего символа подстроки (substring one, substring two, substrin g three) в строке:

Читать:
Как изменить стиль виндовс 7

методы indexofany и lastindexofany

Методы PadLeft и PadRight позволяют дополнить исходный текст до нужного количества символов слева или справа. Для примера создадим новую переменную $string и посмотрим ее длину:

$string = ″my name is Vasya Pupkin″
$string.Length

Как видите, строка содержит 23 символа. Дополним ее точками до 26 символов слева:

а получившуюся строку дополним знаками вопроса до 30 символов справа:

В принципе, процесс можно не разбивать на части, а дополнить сразу с двух сторон:

методы padleft и padright

Методы TrimStart, TrimEnd и Trim обрезают повторяющиеся символы по бокам строки. TrimStart обрезает символы в начале, TrimEnd в конце строки, а Trim — с обоих сторон сразу. В качестве примера возьмем получившуюся в прошлый раз строку и обрежем лишние точки в начале:

и лишние знаки вопроса в конце:

методы trimstart и trimend

Немного о типах данных. Текущий тип данных можно посмотреть с помощью метода GetType, например:

$a = ″string ″
$a.GetType()

В поле Name указан тип данных String (строка).

метод gettype

Строковые данные можно преобразовать в другой тип данных, для чего у строки имеется ряд методов. Для примера возьмем метод ToCharArray и с его помощью преобразуем строку в массив символов:

Если теперь проверить тип данных, то вместо String мы увидим тип Char[].

метод tochararray

Преобразовать тип данных можно и с помощью статического метода Convert. Для примера создадим переменную, содержащую строку, а затем преобразуем ее в число (Int32);

$string = ″123″
$int = [convert]::ToInt32($string)

статический метод convert

Статические методы

Кроме обычных к строке можно применять статические методы. Вывести их список можно все той же командой Get-Member с ключом -Static.

статические методы строки

Методов много, поэтому коротко пробежимся по некоторым из них.

Метод Concat используется для объединения нескольких строк. В качестве примера создадим три стоковых переменных и объединим их:

$a = ″one″
$b = ″two″
$c = ″three″
[string]::Concat($a,$b,$c)

Метод Join также объединяет несколько строк, но с использованием заданного разделителя. Например, объединим строки используя в качестве разделителя двоеточие:

статические методы concat и join

Метод Copy создает точную копию исходной строки:

Метод Compare производит сравнение двух строк и выдает 0 при их совпадении или 1\-1 при несовпадении, аналогично методу CompareTo:

Метод Equals также производит сравнение и выдает результат в виде True\False:

статические методы compare и equals

Метод Compare отличается одним моментом — он позволяет сравнивать строки без учета регистра символов. Для этого в нем используется переключатель $true (без учета регистра) или $false (с учетом регистра). Для примера создадим две переменных, отличающихся только регистром символов:

$a = ″string″
$b = ″String″

А теперь сравним их. Эта команда покажет, что строки идентичны:

А эта — что они различаются:

использованием регистрозависимости и без

И еще пара интересных методов для проверки строк. Метод IsNullOrEmpty проверяет наличие строки, а также не является ли она пустой строкой:

Метод IsNullOrWhiteSpace тоже проверяет наличие строки, а также то, что строка содержит только white-space символы (пробел, табуляция, символ новой строки и т.п.):

Find specific String in Textfile

I know this question might be a «new guy question» but I probably made a logical mistake.

I have a text file and I want to search if it contains a string or not. I tried it as shown below but it doesn’t work:

Bassie's user avatar

4 Answers 4

i think this is what you are trying to do:

In your example, you are defining a string called $SEL and then checking if it is equal to $null (which will of course always evaluate to false , because the string you define is not $null !)

Also, if the file contains the pattern, it will return something like:

So make sure to switch your -eq to -ne or swap your if/else commands around, because currently you are echoing Contains String when the $SEL is $null , which is backwards.

Check SS64 for explanations and useful examples for everything in PowerShell and cmd

Another way of checking if a string exists in the file would be:

but this doesn’t give you an indicaion of where in the file the text exists. This method also works differently in that you are first getting the contents of the file with Get-Content , so this may be useful if you need to perform other operations on those contains after checking for your string’s existence.

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

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

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

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

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

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

Workflow

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

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

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

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

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

Похожие статьи