复制最后一列值

时间:2015-06-04 12:37:01

标签: powershell

我有一个文本文件(由另一个脚本动态生成),如下所示:

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

我想要的:我需要复制" myip"此文件中的列。正如你可以看到" host"之间的空间。和" A"不固定。例如,host1和A之间有7个空格,但host6557和A之间只有4个空格。我需要复制最后一列,所有这些都将从一些值开始,比如" 10。"或" 192。"

如何在PowerShell中实现这一目标?

更新

  1. 我希望将这些数据粘贴到另一个文件中代替第一列,其内容如下所示:这意味着我需要用这些复制的值替换ip1,2,3的值。

    enter image description here

  2. 如果已经完成,假设我说我有第四个值,如上所述(没有凭据)我再次需要从第3个值复制用户名,密码并将其粘贴到第4个附近值。最终预期数字:

    enter image description here

  3. 更新

    $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'"
      }
    }
    

    没有错误,但我无法找到它检查最后一个if循环,因为对于所有值,它表示"无所事事"。

2 个答案:

答案 0 :(得分:3)

使用-split运算符将行拆分为连续的空格,并取最后一个元素:

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

.trim()将删除行中可能导致最后一个split元素为null的任何潜在尾随空格。

答案 1 :(得分: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之类的东西”之间来回乱砍。