0

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 Answers 2

3

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:\> 
Sign up to request clarification or add additional context in comments.

4 Comments

Really sorry about this but it should be the text after the sixth space after the match line. Would you mind adjusting your answer? I was wondering if String.Split would be appropriate here?
Your example works but it's not working on real data. I think it's becuase I have some tabs between some of the words on this line ProcessStepLogID StartedAt. How would you change the regex so that it matches lines after the one beginning with ProcessStepLogID? In other words match the whole line after the one that starts with ProcessStepLogID. I edited my question to show my attempt.
Adjusted the regex. See if that works with your data.
I changed the second line in the regex to ProcessStepLogID.*? and it worked, thanks for your patience and help.
1

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.