Hi All,
I have a text file with the Contents below. I have to fetch only the – CTIA File Checks – info i.e the 3 lines and then Take out the OK or NOT OK value shown below.
OK: ‘Nortel Data Load’, Expected: 2016-08-30 00:00:00, found: 2016-08-30 02:03:00
NOT OK: ‘AVAYA Data Load’, Expected: 2016-08-30 00:00:00, found: 2016-08-30 02:14:56
OK: ‘AUX Data Load’, Expected: 2016-08-30 00:00:00, found: 2016-08-30 02:29:27
Here’s the Text file -> Data.txt · GitHub
Here’s a start.
gc .\text.txt | Select-String “CTIA” -Context 3
Well, that gives the output as below :
Connecting to ‘ABC-043’…
OK
> – CTIA File Checks –
OK: ‘Nortel Data Load’, Expected: 2016-08-30 00:00:00, found: 2016-08-30 02:03:00
NOT OK: ‘AVAYA Data Load’, Expected: 2016-08-30 00:00:00, found: 2016-08-30 02:14:56
OK: ‘AUX Data Load’, Expected: 2016-08-30 00:00:00, found: 2016-08-30 02:29:27
How to extract the exaxt OK and NOT OK from this?
$file = Get-Content c:\myfile.txt
$isCTIA = $False
$lines = ForEach($line in $file)
{
If(-not $isCTIA)
{
If($line -match 'CTIA File Checks')
{
$isCTIA = $True
Continue
}
}
ElseIf (-not $line.Trim())
{
$isCTIA = $False
Continue
}
Else
{
$line
}
}
ForEach ($line in $lines)
{
$line.Split(":")[0]
}
Something along those lines?
my bad, -context 0,3
Here’s another way.
(gc .\text.txt) -match “Nortel Data Load|AVAYA Data Load|AUX Data Load”
Use methods such as trimstart,split,replace.
Thanks Craig and Dan, that worked perfectly 
My co-workers have a tendency to plop my code into their scripts and never learn why. String manipulation is crucial to learning powershell. I’ve had this bookmarked for about six years.
https://technet.microsoft.com/en-us/library/ee692804.aspx
((gc .\text.txt) -match “Nortel Data Load|AVAYA Data Load|AUX Data Load”) -split 'OK: ’ |?{$_ -match ‘data’}
(gc .\text.txt | Select-String “CTIA” -Context 0,3) -split “`n” | %{$_ -split ’ OK: '} | ?{$_ -match ‘data’}
There are multiple ways to do it. I started by removing stuff I didn’t care about like whitespace and log comments:
#Get the Log and remove any line that doesn't have at least 2 semicolons
$log = Get-Content -Path C:\Users\Rob\Desktop\Archive\test.txt | Where {$_ -like "*:*:*"}
Then you can use a WHERE statement because each row you care about in this case contains “Data load” or even just data in the file you provided:
PS C:\Users\Rob> $log | Where{$_ -like "*Data*"}
OK: 'Nortel Data Load', Expected: 2016-08-30 00:00:00, found: 2016-08-30 02:03:00
OK: 'AVAYA Data Load', Expected: 2016-08-30 00:00:00, found: 2016-08-30 02:14:56
OK: 'AUX Data Load', Expected: 2016-08-30 00:00:00, found: 2016-08-30 02:29:27
or SELECT-STRING:
PS C:\Users\Rob> $log | Select-String "Data"
OK: 'Nortel Data Load', Expected: 2016-08-30 00:00:00, found: 2016-08-30 02:03:00
OK: 'AVAYA Data Load', Expected: 2016-08-30 00:00:00, found: 2016-08-30 02:14:56
OK: 'AUX Data Load', Expected: 2016-08-30 00:00:00, found: 2016-08-30 02:29:27
Or you can even go a bit further and actually do a full parse of the log. Not sure how to define the columns, but you should get the jest:
#Get the Log and remove any line that doesn't have at least 2 semicolons
$log = Get-Content -Path C:\Users\Rob\Desktop\Archive\test.txt | Where {$_ -like "*:*:*"}
$results = foreach ($line in $log) {
$arrLine = $line -split ","
$props = [ordered]@{
Status=$arrLine[0].Split(":")[0]
Message=$arrLine[0].Split(":")[1]
Threshold=$arrLine[1]
Current=$arrLine[2]
}
New-Object -TypeName PSObject -Property $props
}
which gives you a object to work with:
PS C:\Users\Rob> $results | Select -First 10
Status Message Threshold Current
------ ------- --------- -------
OK VW_PARTITIONED_FCT_CALL_DETAIL_END Expected: 2016-08-30 06:42:58 found: 2016-08-30 06:56:30
OK VW_PARTITIONED_FCT_CALL_DETAIL_LEG Expected: 2016-08-30 06:42:58 found: 2016-08-30 06:55:50
OK VW_CUS_PARTITIONED_FCT_TCD_CORRELATED Expected: 2016-08-30 05:58:11 found: 2016-08-30 06:37:25
OK VW_CUS_PARTITIONED_FCT_TCD_CONTACT_CORRELATED Expected: 2016-08-30 05:58:11 found: 2016-08-30 06:37:25
OK VW_CUS_PARTITIONED_FCT_SOFTPHONE_TRANSFER_EVENT Expected: 2016-08-30 05:58:15 found: 2016-08-30 06:55:59
OK VW_CUS_PARTITIONED_FCT_AGENT_EVENT Expected: 2016-08-29 23:30:00 found: 2016-08-29 23:59:59
OK VW_CUS_PARTITIONED_SUM_AGENT_EVENT_HH Expected: 2016-08-29 23:30:00 found: 2016-08-29 23:30:00
OK VW_CUS_PARTITIONED_SUM_AGENT_HH Expected: 2016-08-29 23:30:00 found: 2016-08-29 23:30:00
OK VW_CUS_PARTITIONED_FCT_AVAYA_AGENT_EVENT Expected: 2016-08-29 23:30:00 found: 2016-08-29 23:59:59
OK VW_CUS_PARTITIONED_SUM_AVAYA_AGENT_EVENT_HH Expected: 2016-08-29 23:30:00 found: 2016-08-29 23:30:00
Then you would parse the Message column and could remove the “Status”:
PS C:\Users\Rob> $results | Where{$_.Message -like "*Data*"} | Select Message, Threshold, Current
Message Threshold Current
------- --------- -------
'Nortel Data Load' Expected: 2016-08-30 00:00:00 found: 2016-08-30 02:03:00
'AVAYA Data Load' Expected: 2016-08-30 00:00:00 found: 2016-08-30 02:14:56
'AUX Data Load' Expected: 2016-08-30 00:00:00 found: 2016-08-30 02:29:27