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

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

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

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

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

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

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-beta). Он дает вам массив объектов 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 покажет String, а не объект MatchInfo.

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

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

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

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

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

Другие вопросы по тегам