我有一个文本文件(由另一个脚本动态生成),如下所示:
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中实现这一目标?
更新
我希望将这些数据粘贴到另一个文件中代替第一列,其内容如下所示:这意味着我需要用这些复制的值替换ip1,2,3的值。
如果已经完成,假设我说我有第四个值,如上所述(没有凭据)我再次需要从第3个值复制用户名,密码并将其粘贴到第4个附近值。最终预期数字:
更新
$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循环,因为对于所有值,它表示"无所事事"。
答案 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之类的东西”之间来回乱砍。