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
,