Reputation: 55
i have output from external command, like as:
Status Pool name Media Type MS # of media Free [MB]
===============================================================================
Good pool1 LTO-Ultrium No 303 298066893
Good pool2 LTO-Ultrium No 1 1525878
Good pool3 LTO-Ultrium No 282 348735361
Good pool4 LTO-Ultrium No 473 588150645
i need parse in PowerShell "pool1", "pool2", "pool3" ... and run command in foreach... any idea for this, without exporting output to xml, csv & etc ? thanks
and, Q2, is here same, or similar way for parsing these:
Good [QGHL5MMA] QGHL5MMA [pool1: 322] No None
Good [QGHL5N2Y] QGHL5N2Y [pool1: 922] No None
Good [QGHL5MUL] QGHL5MUL [pool1: 621] No None
From this output, i need only text from column 5 ( 322, 922, 621... ). thanks again
Upvotes: 4
Views: 10458
Reputation: 3781
A simple regex will capture the result.
gc .\table.txt | sls '\s+(pool\d+)\s+' | % {$_.Matches.Groups[1].Value}
Upvotes: 0
Reputation: 68243
If you create objects, you can do all kinds of Powershell things with them when you're done. Powershell is all about the objects.
Using your sample data and Powershell V3
$CommandData =
(@'
Status Pool name Media Type MS # of media Free [MB]
===============================================================================
Good pool1 LTO-Ultrium No 303 298066893
Good pool2 LTO-Ultrium No 1 1525878
Good pool3 LTO-Ultrium No 282 348735361
Good pool4 LTO-Ultrium No 473 588150645
'@).split("`n") |
foreach {$_.trim()}
$CommandData |
foreach {
$Props = &{$args} Status Pool Media Type MS No Free[MB]
if ($_ -match '\d+\s*$')
{$Parts = $_ -split '\s+'
$Hash = [ordered]@{}
for ($i=0; $i -le 5; $i++)
{$Hash[$Props[$i]] = $Parts[$i]}
[PSCustomObject]$Hash
}
} | | Format-Table -AutoSize
Status Pool MediaType MS No Free[MB]
------ ---- --------- -- -- --------
Good pool1 LTO-Ultrium No 303 298066893
Good pool2 LTO-Ultrium No 1 1525878
Good pool3 LTO-Ultrium No 282 348735361
Good pool4 LTO-Ultrium No 473 588150645
Upvotes: 1
Reputation: 980
I put the content into a file test.txt
and did a try as below:
gc .\test.txt | select-string '.*pool\d+.*' | foreach { $pool = ($_ -split '\s+')[1];write-host $pool;}
And the output:
pool1
pool2
pool3
pool4
In the command line I search the lines which has the pattern as 'pool' followed by digits, and then split it using whitespace as delimiter, then you can get the name 'pool1' etc. to do the things you want.
Upvotes: 4