Select-String в Powershell отображает только часть строки из текстового файла, нужно, чтобы он отображал все это

Я пытаюсь написать простой сценарий PS для проверки больших файлов журнала .txt на наличие короткой строки: «SRVE0242I:»

$lines = Select-String -Path $logDir -Pattern "SRVE0242I:" | Select-Object line | Out-String

Однако на выходе он отображает только следующее:

Line
[28/06/17 13:48:27:839] 00000020 ServletWrappe I SRVE0242I: [Пользователь] [Пользователь] [com_xxxxxxx_...

И не полная линейка. Есть ли ограничение на количество символов, которые это тянет? Я не могу найти информацию о каких-либо ограничениях для командлета Select-String. Есть ли лучший способ сделать это, чтобы я не а) вытягивал заголовок «Строка» в моем списке строк (на самом деле не хочу создавать форматирование таблицы для такого простого вывода) и б) получить всю строку когда я вытащу информацию?


person user3431504    schedule 04.07.2017    source источник
comment
Вместо Select-String -Path $logDir -Pattern "SRVE0242I:" | Select-Object line вы, вероятно, можете использовать (Select-String -Path $logDir -Pattern "SRVE0242I:").line Это избавляет от ограничения длины вывода строки выбора.   -  person Sahil Singh    schedule 04.06.2018


Ответы (2)


Есть! Короче говоря, Select-Object делает усечение здесь. Вот один из способов получить первую необрезанную строку в выводе Select-String.

$(Select-String -Path $logDir -Pattern "SRVE0242I:")[0].Line

Когда вы сталкиваетесь с чем-то подобным, вы можете разбить отдельные шаги, чтобы определить, что происходит, передав вещи Get-Member. Вот что происходит в приведенном выше коде:

Select-String <# args #> | Get-Member

Select-String дает нам объект MatchInfo, который (как вы правильно определили) имеет свойство Line. При самостоятельном запуске Select-String фактически выдает всю информацию, которую вы ищете, и не усекает ее по умолчанию (по крайней мере, в бета-версии v6.0.0). Он дает вам массив объектов MatchInfo, если находит несколько совпадений, поэтому вам нужно индексировать этот массив, если вам нужен только первый (как я сделал выше).

Select-String <# args #> | Select-Object Line | Get-Member

Select-Object применяет форматирование PowerShell по умолчанию для объектов, которое в большинстве случаев усекает вывод для более удобного просмотра. Для объектов с большим количеством членов (таких как объект MatchInfo) он по умолчанию попытается сделать по одному на строку.

Select-String <# args #> | Select-Object Line | Out-String | Get-Member

Out-String напрямую преобразует ввод в строку. То есть вместо того, чтобы пытаться привести что-то к строке или извлечь строковое свойство из переданного ему объекта, он просто изменяет все, что получает, в объект. В этом случае он превращает уже отформатированный вывод MatchInfo в строку. С выводом на терминал ничего не происходит, но Get-Member покажет строку, а не объект MatchInfo.

Здесь это не имеет прямого отношения, но если вы заинтересованы в изменении форматирования по умолчанию, оно регулируется types.ps1xml.

person Community    schedule 04.07.2017

Вы видите это так, потому что оно отображает свойство Line, используя представление Format-Table по умолчанию и сокращая его до ширины консоли.

Сделайте это вместо этого:

$lines = Select-String -Path $logDir -Pattern "SRVE0242I:" | Select-Object -ExpandProperty line

Это возвращает значение свойства Line в виде строки в переменную $lines. Вам не нужно использовать Out-String.

person Mark Wragg    schedule 04.07.2017