将 powershell 中的两个字符串进行比较,正则表达式 * 匹配,根据匹配从 string1 输出DataSpac



我有一个CSV中的开关列表以及这些开关所在的数据空间列表。 在我的数据空间列表中,我有一个表示其关联DataSpace_Name的DataSpace_ID字段。

我的交换机列表有一个Host_Name和IP_Address字段。 我想要的是使用PowerShell和使用通配符的正则表达式匹配,我想将数据空间字段示例"ABC-COM"与开关列表Host_Name匹配,这将是ABC-COM-3750-SW1。 我只想匹配ABC-COM...

然后对于我的结果,我希望输出基于找到的匹配项关联找到的DataSpace_ID值并将其包含在开关列表的输出中。

假设我匹配 ABC-COM = DATASPACE_ID 1 和 DEF-COM = DataSpace_ID 2,我的交换机数据为:

Host_Name IP_Address ABC-COM-3750-SW1 IP 192.168.1.2 ABC-COM-3750-SW2 IP: 192.168.1.3 DEF-COM-3750-SW1 IP: 192.168.3.5 DEF-COM-3750-SW2 IP: 192.168.3.6

因此,最终您将根据数据空间列表的比较从交换机列表中获得此输出,除了它会从数据空间名称的其他比较列表中添加DataSpace_ID列... 切换列表 输出如下所示:

DataSpace_ID Host_Name IP_Address 1 ABC-COM-3750-SW1 IP 192.168.1.2 1 ABC-COM-3750-SW2 IP: 192.168.1.3 2 DEF-COM-3750-SW1 IP: 192.168.3.5 2 DEF-COM-3750-SW2 IP: 192.168.3.6

这是我根据您的一些输入修改的最新代码,我不再收到错误,但是我的输出也没有返回任何结果。

清除主机 $hash.clear() $dataSpacesExport = import-csv -path .\DataSpaces_Export.csv -header 'DataSpace_ID', 'DataSpace_Name' -delimiter "," $accessSwitchesForExport = import-csv -path .\AccessSwitchForExport.csv -header 'Host_Name', 'IP_Address' -delimiter "," # 创建哈希表 $hash = @{} # 创建正则表达式标准 $re = [正则表达式]".+(?=-\d+)" $dataSpacesExport |转换自 CSV |% { $hash.添加($_,"$_") } # 输出 $accessSwitchesForExport |转换自 CSV | 选择对象 @{ n = "DataSpace_ID"; e = { $hash[$re.匹配($_。Host_Name)。值] } },* | Where-Object { $_.DataSpace_ID -ne $null }

我的 CSV 文件 正如一些人所要求的,示例数据是: 数据空间和交换机输出示例在下面的帖子中。 数据空间包含DataSpace_ID和DataSpace_Name,交换机 csv 包含Host_Name和IP_Address字段。

基于两个 csv 的比较的输出如下所示,应显示: 最终表中匹配DataSpace_ID与匹配Host_Name及其关联的 IP 地址。

这是一个使用哈希表的解决方案。

$dataSpacesExport = @"
DataSpace_ID,DataSpace_Name
1,ABC-COM
2,DEF-COM
"@ 
$accessSwitchesForExport = @"
Host_Name,IP_Address
ABC-COM-3750-SW1,IP: 192.168.1.2
ABC-COM-3750-SW2,IP: 192.168.1.3 
DEF-COM-3750-SW1,IP: 192.168.3.5
DEF-COM-3750-SW2,IP: 192.168.3.6
GHI-COM-3750-SW2,IP: 192.168.3.6
"@
$re = [regex]".+(?=-d+)"
# create hashtable
$id = @{}
$dataSpacesExport | ConvertFrom-Csv | ForEach-Object { $id[$_.DataSpace_Name] = $_.DataSpace_ID }
# output
$accessSwitchesForExport | ConvertFrom-Csv |
Select-Object @{ n = "DataSpace_ID"; e = { $id[$re.Match($_.Host_Name).Value] } },* |
Where-Object { $_.DataSpace_ID -ne $null }

输出如下。

DataSpace_ID Host_Name        IP_Address      
------------ ---------        ----------      
1            ABC-COM-3750-SW1 IP: 192.168.1.2  
1            ABC-COM-3750-SW2 IP: 192.168.1.3 
2            DEF-COM-3750-SW1 IP: 192.168.3.5 
2            DEF-COM-3750-SW2 IP: 192.168.3.6 

以下代码是另一种解决方案。在这种情况下,您不需要正则表达式。

$dataSpaces = $dataSpacesExport | ConvertFrom-Csv
$accessSwitchesForExport | ConvertFrom-Csv | ForEach-Object {
foreach ($ds in $dataSpaces) {
if (!$_.Host_Name.StartsWith($ds.DataSpace_Name)) { continue }
[pscustomobject]@{
DataSpace_ID = $ds.DataSpace_ID
Host_Name = $_.Host_Name
IP_Address = $_.IP_Address
}
break
}
}

谢谢大家的帮助! 我使用了上述建议的零碎部分来得出以下结果,该结果完美运行并生成所需的数据。

#Set Present Working Directory for path to save data to. 
#Clear any Hash Table Data prior to start of script //
$id.clear()
#Import current listing of Data Spaces and Access switches from CSV format //
$dataSpacesExport = import-csv -Header DataSpace_ID, DataSpace_Name -Path ".DataSpaces_Export.csv"
$accessSwitchesForExport = import-csv -Header Host_Name, Device_IP -Delimiter "," -Path ".AccessSwitchesForExport.csv"
#Regex text matching criteria //
$re = [regex]".+(?=-d+)"
# create hashtable to store output //
$id=@{}
# Inject DataSpaces listing into Script for processing via hash table $id //
$dataSpacesExport | % {$id[$_.DataSpace_Name] = $_.DataSpace_ID}

# output - Compare Access Switch listing to DataSpaces Hashtable information, produce output to out-file sw_names.txt //
$accessSwitchesForExport |
Select-Object @{ n = "DataSpace_ID"; e = { $id[$re.Match($_.Host_Name).Value] } },* |
Where-Object { $_.DataSpace_ID -ne $null } | Out-File ./sw_names.txt -Force 

输出符合预期,现在正在工作。

相关内容

  • 没有找到相关文章

最新更新