Powershell -Select String (SLS), разбивающая одну строку на кратные - PullRequest
1 голос
/ 14 февраля 2020

Я искал способ выполнить basi c grep с Powershell.

У меня есть входной текстовый файл, но я хочу извлечь только некоторые из них. Например,

2020-02-04 05:42:12,132 INFO UselessLog   8=FIX4.4|35=D|49=sender1|56=recipient|....
2020-02-04 05:42:12,134 INFO UselessLog2  8=FIX5.0|35=AB|49=sender2|56=recipient2|....
2020-02-04 05:42:12,136 INFO UselessLog2  8=FIX5.0|35=AB|49=sender3|56=recipient2|....

Я пытаюсь проанализировать файл с помощью

sls "8=FIX" fixlogs -ca | select -exp line |sls "=sender1" > parseFix

Однако, когда я открываю файл parseFix, sls просто преобразует одну строку в несколько; Например, следующие две строки представляют одинарное соответствие:

2020-02-04 05:42:12,132 INFO UselessLog   
8=FIX4.4|35=D|49=sender1|56=recipient|...

Я вполне уверен, что в Powershell есть конфигурация, которая советует не разбивать, но я исследовал и не смог найти один.

У меня нет доступа к Unix / Linux серверу для выполнения grep magi c, также я проверил в StackOverFlow, но не нашел ничего соответствующего моему Вопросу.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Здесь много чего происходит. Select-string выводит объект в произвольном формате. «>» аналогично «| out-file», который добавляет дополнительное форматирование, например перенос строки, если он считает, что он слишком длинный. Вы не показали все строки журнала, но они выглядят довольно длинными. Кстати, out-file по умолчанию имеет кодировку utf16 (PS 5). Кажется, что set-content работает нормально и преобразует объект в строку:

sls 8=FIX fixlogs -ca | select -exp line | sls =sender1 | set-content parsefix

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

sls 8=FIX.*=sender1 fixlogs 

fixlogs:1:2020-02-04 05:42:12,132 INFO UselessLog   8=FIX4.4|35=D|49=sender1|56=recipient|....

Или просто пропустите выбор:

sls 8=FIX fixlogs -ca | sls =sender1
0 голосов
/ 14 февраля 2020

Вам нужно еще один select -exp line вызов после вашего 2-го sls (Select-String) вызова, чтобы убедиться, что соответствующие строки записаны как есть в выходной файл:

sls "8=FIX" fixlogs -ca | select -exp line |sls "=sender1" | select -exp line > parseFix

Примечание. В PowerShell [Core] 7.0+ вы можете использовать Select-String -Raw для непосредственного вывода совпадающих строк без объекта-оболочки, предоставляющего метаданные о совпадении, которое вы получаете по умолчанию. То есть тогда нет необходимости извлекать строки с помощью отдельных вызовов select -exp Line (Select-Object -ExpandProperty Line).


Почему ваши выходные строки были разорваны на части :

В отличие от grep или findstr, Select-String выводит информацию о совпадении объекты (типа Microsoft.PowerShell.Commands.MatchInfo), которые переносят соответствующие строки , а не только сами совпадающие строки.

Эти объекты, так как они не являются единичными значениями, такими как, например, строка или число, условно, подвергаются форматированию вывода по умолчанию в PowerShell при отправке их в файл с оператор >, который фактически является псевдонимом для Out-File, и это форматирование (то же представление, которое вы видите в консоли) включает автоматическое c перенос слов, то есть разбиение длинных строк на несколько строк, чтобы соответствовать отображению ширина (даже если файл не имеет собственной ширины; Out-File -Width позволит вам контролировать эту ширину).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...