2015-06-04 68 views
-1

我有一個文本文件(由另一個腳本動態生成的),如下圖所示:複製最後一列值

host1  A  Answer  myip1 
host6557 A  Answer  myip2 
host12  A  Question myip3 
host253  A  Answer  myip4 

我想:我需要從這個文件複製「MYIP」欄目。正如你所看到的,「主機」和「A」之間的距離並不固定。例如,host1和A之間有7個空格,但host6557和A之間只有4個空格。我需要複製最後一列,這些列都以一些值開始,例如「10.」。或「192」。

在PowerShell中如何實現?

更新

  1. 我想這個數據到另一個文件粘貼到位1列,其中的內容將如下圖所示:這意味着我需要更換的ip1,2值, 3與這些複製的值。

    enter image description here

  2. 如果它這樣做,假設讓我們說我有第4個值像上面(無憑據),我需要再次複製從第3個值的用戶名,密碼,然後貼有接近第4個值。最終預期的數字:

    enter image description here

更新

$hip = Get-Content "C:\timezone\host - Copy.txt" 
foreach ($ips in $hip) { 
    $ip = $ips -split ',' 
    $sip = $ip[0] 

    if ($iplist -match $sip) { 
    Write-Host "Nothing to do" 
    } else { 
    Add-Content $hip "`n$iplist',username,password'" 
    } 
} 

沒有錯誤,但我不能找到它檢查的最後,如果循環,因爲所有的值,它說「無關」。

回答

2

使用-split運營商分割在連續的空格行,並採取最後一個元素:

Get-Content testfile.txt | 
foreach { ($_.trim() -split '\s+')[-1] } 

.trim()將刪除在該行的任何潛在尾隨空格會導致最後的分割元件是空值。

+0

謝謝。但是,請您在帖子中看到我的更新1和2。 – serverstackqns

+0

@serverstackqns請付出一些努力。我們不在這裏爲你做你的工作。 –

+0

嘿@AnsgarWiechers:請不要評論,如果你是我的老闆..只要來到這裏,如果你想知道我是多麼努力。我正在用自己的方式嘗試,但事情並不奏效,我在這裏......這並不是說我爲了好玩而提出問題。理解並說話! – serverstackqns

0

如果你讓powershell爲你做髒解析工作,你想做什麼,更容易達到目的。

鑑於多空格分隔從你的問題的文件是hosts.txt和逗號分隔文件credentials.txt,你可以用下面的辦法把它們變成PowerShell中對象的集合,你可以工作:

$hosts = ConvertFrom-Csv (gc .\hosts.txt | % { $_ -replace '\s+', ',' }) -Header 'Computername','Foo','Bar','IP' 
$credentials = Import-Csv -Path .\credentials.txt -Header 'IP', 'Username','Password' 

要替換的IP列,您可以嘗試的東西沿着這條線:

for ($i = 0; $i -lt $credentials.Length; $i++) 
{ 
    $credentials[$i].IP = $hosts[$i].IP 
} 

我從你的問題得到,你可能有更多的主機,比憑據爲保持它們相互關聯,並且您希望將之前行中的憑據複製過來。我會做這樣的事情:

$remainingHosts = @() 
if ($hosts.Length -gt $credentials.Length) 
{ 
    $remainingHosts = $hosts[($credentials.Length)..($hosts.Length-1)] 
} 

$lastCredentials = $credentials[-1] 
foreach ($h in $remainingHosts) 
{ 
    $credentials += $lastCredentials | select -Property @{Name='IP'; Expression={$h.IP}},Username,Password 
} 

最後將結果保存回你的credentials.txt你可以再次參加CSV方法:

$null, $credentialCsv = $credentials | ConvertTo-Csv -NoTypeInformation 
$credentialCsv | Out-File .\credentials.txt 

當然不是黑客來回CSV之間的「類似於csv的東西「,您可以考慮使用適當的csv文件。