Выделить конкретную строку из строк через регулярное выражение - PullRequest
0 голосов
/ 09 февраля 2019

Я пытался извлечь определенные, равные 40 значения, получить шестое последнее слово из нескольких строк в файле .txt с помощью PowerShell.

У меня есть код:

$file = Get-Content 'c:\temp\file.txt'
$Array = @()
foreach ($line in $file)
{
$Array += $line.split(",")[6]
}
$Array
$Array | sc "c:\temp\export2.txt"

TXT-файл: (могут быть повторяющиеся строки, такие как hostname01)

4626898,0,3,0,POL,INCR,hostname01,xx,1549429809,0000000507,1549430316,xxx,0,40,1,xxxx,51870834,5040,100
4626898,0,3,0,POL,INCR,hostname02,xx,1549429809,0000000507,1549430316,xxx,0,15,1,xxxx,51870834,5040,100
4626898,0,3,0,POL,INCR,hostname03 developer host,xx,1549429809,0000000507,1549430316,xxx,0,40,1,xxxx,51870834,5040,100
4626898,0,3,0,POL,INCR,hostname01,xx,1549429809,0000000507,1549430316,xxx,0,40,1,xxxx,51870834,5040,100

Это то, что я хочу:

hostname01
hostname02
hostname03 developer host

Ответы [ 4 ]

0 голосов
/ 09 февраля 2019

Это не быстрое решение, а удобное и гибкое одно:

  • Поскольку ваш текстовый файл фактически является файлом CSV, вы можете использовать Import-Csv.

    • Поскольку ваши данные отсутствуют, это строка заголовка (имена столбцов), которую мы можем предоставить Import-Csv через -Headerпараметр.
    • Поскольку вас интересуют номера столбцов 7 (имена хостов) и 14 (число, значение которых должно быть 40), нам необходимо предоставить имена столбцов (по нашему выбору) длястолбцы с 1 по 14.
  • Import-Csv удобно преобразовывает строки CSV в (пользовательские) объекты , свойства которых можно запрашивать с помощью Where-Object ивыборочно экстракт с Select-Object;добавление -Unique подавляет повторяющиеся значения.

Чтобы сложить все вместе:

Import-Csv c:\temp\file.txt -Header (1..14) | 
  Where-Object 14 -eq 40 |
    Select-Object -ExpandProperty 7 -Unique

Для удобства мы назвали столбцы 1,2, ... с использованием выражения диапазона (1..14), но вы можете использовать описательные имена.

Если предположить, что c:\temp\file.txt содержит ваши данные выборки, приведенные выше результаты:

hostname01
hostname03 developer host

Чтобы вывести в файл, перенаправьте вышеприведенное в Set-Content, как в вашем вопросе:

... | Set-Content c:\temp\export2.txt
0 голосов
/ 09 февраля 2019

Если требуемое поле всегда является шестым в строке, проще разбить каждую строку и извлечь 6-й элемент:

Get-Content 'c:\temp\file.txt' | Foreach-Object {($_ -split ',')[6]} | Select-Object -Unique
0 голосов
/ 09 февраля 2019

Ниже должно работать с тем, что вы пытаетесь сделать

Get-Content 'c:\temp\file.txt' | %{ 
    $_.Split(',')[6]
}| select -Unique
0 голосов
/ 09 февраля 2019

Вы можете использовать группу без захвата, чтобы просмотреть строку для правильного формата и связать имя вашего 6 элемента с 1-й группой захвата $1:

(?:\d+,\d,\d,\d,[A-Z]+,[A-Z]+,)([a-zA-Z 0-9]+)

Демоздесь

  • (?: ) - Указывает группу без захвата (то есть на нее не ссылаются ни через $ 1, ни $ 2, как вы обычно делаете с группой захвата
  • \d+,(Я не буду повторять все это, но) в поисках одной или нескольких цифр, за которыми следует литерал ,.
  • [A-Z]+, - Находит строку из всех заглавных букв, за которой следует литерал , (это происходит дважды).
  • ([a-zA-Z 0-9] +) - группа захвата, которую вы ищете, $ 1, которая захватит все символы a-z, A-Z, пробелы и цифры до тех пор, пока символ не входит в этот набор (в данном случае запятая). Дает вам искомый текст.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...