0
votes

I have a multi-line string and I need to get a single word from the string. The word is on a line that follows this text exactly: ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text and starts at character 57.

What would be the best way in Powershell to return that single word that starts at character position 57 on the following line? Here's some sample text where I would like to return the text I_NEED_TO_BE_FOUND:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum at consequat neque, sed dictum massa. In hac habitasse platea dictumst. Aenean ante justo, dapibus quis dolor a, dictum hendrerit risus. Quisque sit amet porttitor ex. Curabitur tempor sed augue nec congue. Vestibulum lectus sem, iaculis quis dignissim at, condimentum sed diam. Ut libero quam, elementum egestas tristique eu, fringilla eget ipsum.

Etiam dui nisi, blandit a tempus vitae, dictum ultricies neque. Duis hendrerit nunc id egestas tempus. Praesent egestas viverra orci id pretium. Phasellus augue enim, porttitor vulputate mattis sit amet, vulputate et diam. Fusce vitae tempus nisi. Sed auctor mi mollis pellentesque cursus. Sed vel quam vestibulum, pulvinar magna vel, tincidunt nisi. Sed efficitur id dui a accumsan.

ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text
201605050000064594 2016-05-05 14:46:37.790 4 sec 1 I_NEED_TO_BE_FOUND A_Command

Morbi interdum vestibulum turpis, ut pellentesque felis sollicitudin non. Ut dignissim ligula velit, non commodo tellus sodales lacinia. Maecenas tempus aliquam lacus at efficitur. Duis turpis tellus, condimentum ut ullamcorper ac, porttitor quis urna. In hac habitasse platea dictumst. Donec suscipit velit turpis, quis pretium sapien suscipit quis. Maecenas at enim ac nibh malesuada commodo eget quis libero.

EDIT

I tried this modification of @mjolinor's answer but it doesn't match.

$text = @'
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum at consequat neque, sed dictum massa. In hac habitasse platea dictumst. Aenean ante justo, dapibus quis dolor a, dictum hendrerit risus. Quisque sit amet porttitor ex. Curabitur tempor sed augue nec congue. Vestibulum lectus sem, iaculis quis dignissim at, condimentum sed diam. Ut libero quam, elementum egestas tristique eu, fringilla eget ipsum.

Etiam dui nisi, blandit a tempus vitae, dictum ultricies neque. Duis hendrerit nunc id egestas tempus. Praesent egestas viverra orci id pretium. Phasellus augue enim, porttitor vulputate mattis sit amet, vulputate et diam. Fusce vitae tempus nisi. Sed auctor mi mollis pellentesque cursus. Sed vel quam vestibulum, pulvinar magna vel, tincidunt nisi. Sed efficitur id dui a accumsan.

ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text
201605050000064594 2016-05-05 14:46:37.790 4 sec 1 I_NEED_TO_BE_FOUND A_Command

Morbi interdum vestibulum turpis, ut pellentesque felis sollicitudin non. Ut dignissim ligula velit, non commodo tellus sodales lacinia. Maecenas tempus aliquam lacus at efficitur. Duis turpis tellus, condimentum ut ullamcorper ac, porttitor quis urna. In hac habitasse platea dictumst. Donec suscipit velit turpis, quis pretium sapien suscipit quis. Maecenas at enim ac nibh malesuada commodo eget quis libero.
'@

$regex = @'
(?ms).+
^ProcessStepLogID
(.+)
.+
'@

if ($text -match $regex)
  {$matches[1].Split()[6]}
2

2 Answers

3
votes

Using a multi-line regex. (It looks like your target strings actually starts at position 52)

    PS C:\> $text = @'
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum at consequat neque, sed dictum massa. In hac habitasse platea dictumst. Aenean ante justo, dapibus quis dolor a, dictum hendrerit risus. Quisque sit amet porttitor ex. Curabitur tempor sed augue nec congue. Vestibulum lectus sem, iaculis quis dignissim at, condimentum sed diam. Ut libero quam, elementum egestas tristique eu, fringilla eget ipsum.

Etiam dui nisi, blandit a tempus vitae, dictum ultricies neque. Duis hendrerit nunc id egestas tempus. Praesent egestas viverra orci id pretium. Phasellus augue enim, porttitor vulputate mattis sit amet, vulputate et diam. Fusce vitae tempus nisi. Sed auctor mi mollis pellentesque cursus. Sed vel quam vestibulum, pulvinar magna vel, tincidunt nisi. Sed efficitur id dui a accumsan.

ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text
201605050000064594 2016-05-05 14:46:37.790 4 sec 1 I_NEED_TO_BE_FOUND A_Command

Morbi interdum vestibulum turpis, ut pellentesque felis sollicitudin non. Ut dignissim ligula velit, non commodo tellus sodales lacinia. Maecenas tempus aliquam lacus at efficitur. Duis turpis tellus, condimentum ut ullamcorper ac, porttitor quis urna. In hac habitasse platea dictumst. Donec suscipit velit turpis, quis pretium sapien suscipit quis. Maecenas at enim ac nibh malesuada commodo eget quis libero.
'@

$regex = @'
(?ms).+
ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text.*?
(.+)
.+
'@

if ($text -match $regex)
  {$matches[1].Split()[6]}

I_NEED_TO_BE_FOUND

PS C:\> 
1
votes

this may be an option for you

$string = @'
Etiam dui nisi, blandit a tempus vitae, dictum ultricies neque.

ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text
201605050000064594 2016-05-05 14:46:37.790 4 sec 1 I_NEED_TO_BE_FOUND A_Command

Morbi interdum vestibulum turpis, ut pellentesque felis sollicitudin non.
'@

$array = $string.Split("`n")

$selection = $array | select-string -Pattern 'processsteplogid' -Context 1

$csvstring = $selection.ToString().Split("`n").Trim('> ').Replace(' ', ',') | select -Skip 1

$obj = $csvstring | ConvertFrom-Csv

$obj

after seeing mjolinor's answer, here is how i would create the object using a regular expression, and i think the result from this looks better than my previous example

$regex = '(ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text\r?\n.*)'

$obj = if ($string -match $regex) {
    $Matches[1].Split("`n") | ConvertFrom-Csv -Delimiter ' '
}

$obj

because of the spaces, the object name-value pairs may be nonsense, but - assuming there will always be the same number of spaces - you can get what you want out of $obj.process or this can be further refined to make sense of the property names in relation to their values