Home > Net >  Parse info from Text File - Powershell
Parse info from Text File - Powershell

Time:11-18

Beginner here, I am working on a error log file and library, the current step I am on is to pull specific information from a txt file.

The code I have currently is...

$StatusErr = "Type 1","Type 2"

for ($i=0; $i -lt $StatusErr.length; $i  ) {
  get-content C:\blah\Logs\StatusErrors.TXT | 
    select-string $StatusErr[$i] |
    add-content C:\blah\Logs\StatusErrorsresult.txt
}

while it is working, I need it to display as

Type-1-Description  
2-Description  
Type-1-Description  
2-Description  
Type-1-Description  
2-Description

etc.

it is currently displaying as

Type 1 = Type-1-Description  
Type 1 = Type-1-Description  
Type 1 = Type-1-Description  
Type 2 = 2-Description  
Type 2 = 2-Description  
Type 2 = 2-Description  

I am unsure how to change the arrangement and remove unneeded spaces and the = sign

CodePudding user response:

  • You need to search for both patterns in a single Select-String call in order to get matching lines in order.

    • While the -Pattern parameter does accept an array of patterns, in this case a single regex will do.
  • You need to use a regex pattern in order to capture and output only part of the lines that match.

$StatusErrRegex = '(?<=Type [12]\s*=\s*)[^ ] '

get-content C:\blah\Logs\StatusErrors.TXT | 
  select-string $StatusErrRegex |
  foreach-object { $_.Matches.Value } |
  set-content C:\blah\Logs\StatusErrorsresult.txt

Note that I've replaced add-content with set-content, as I'm assuming you don't want to append to a preexisting file. set-content writes all objects it receives via the pipeline to the output file.

Select-String outputs Microsoft.PowerShell.Commands.MatchInfo instances whose .Matches property provides access to the part of the line that was matched.

For an explanation of the regex and the ability to experiment with it, see this regex101.com page.

Additional notes:

  • Select-String, like PowerShell in general, is case-insensitive by default; add the
    -CaseSensitive switch, if needed.

  • (?<=...) is a (positive) lookbehind assertion, whose matching text doesn't became part of what the regex captures.

  • \s* matches zero or more whitespace characters; \s would match one or more.

  • [^ ] matches one or more ( ) characters that are not ^ spaces ( ), and thereby captures the run of non-space characters to the right of the = sign.

  • To match any of multiple words at the start of the pattern, use a regex alternation (|), e.g. '(?<=(type|data) [12]\s*=\s*)[^ ] '

  • Related