用于检测重复的主机名的PowerShell脚本-但仅主机名的一部分

时间:2018-06-20 14:15:41

标签: powershell

如果我有一个主机名列表(csv,txt,数组等),例如:

abc123A
aab123B
bcd123C
def123A
abb123B
abb123A
abb123B

如何确保前3个字母(站点代码)只有一个实例/ host在数组或列表中?我不需要站点上的任何其他主机,每个唯一站点中的一个主机都可以代表我的最终列表

July

上面的代码本质上仅查找重复项-我可以指定前三个字母以某种方式被看?

提前谢谢

4 个答案:

答案 0 :(得分:6)

您可以找到以下重复项:

Get-Content .\names.txt |
    Group-Object @{e={$_.Substring(0,3)}} |
        Sort-Object Count -Descending

您的示例如下:

Count Name Group                      
----- ---- -----                      
    3 abb  {abb123B, abb123A, abb123B}
    1 abc  {abc123A}                  
    1 aab  {aab123B}                  
    1 bcd  {bcd123C}                  
    1 def  {def123A}

如果您想要一个只有一个项目的数组,请说出每个组中的第一个项目,然后将其更改为:

$finalList = Get-Content .\names.txt |
                Group-Object @{e={$_.Substring(0,3)}} |
                    Sort-Object Count -Descending |
                        ForEach-Object {
                            $_.Group[0]
                        }

$finalList在这种情况下将是:

abb123B
abc123A
aab123B
bcd123C
def123A

答案 1 :(得分:1)

这是你的意思吗?

@("abc123A",
"aab123B",
"bcd123C",
"def123A",
"abb123B",
"abb123A",
"abb123B") | select @{ Name = 'Site';  Expression = {$_.SubString(0,3)}} | Select-Object -Property Site -Unique

这将产生以下内容:

Site                                                                                                                                                                                                                                                             
----                                                                                                                                                                                                                                                             
abc                                                                                                                                                                                                                                                              
aab                                                                                                                                                                                                                                                              
bcd                                                                                                                                                                                                                                                              
def                                                                                                                                                                                                                                                              
abb   

它使用计算所得的属性从列表中选择前三个字母。

如果要查看分组,可以使用以下方法:

select @{ Name = 'Site';  Expression = {$_.SubString(0,3)}}, @{ Name = 'Host';  Expression = {$_}} | Group-Object -Property Site

哪个会产生这个:

Count Name                      Group                                                                                                                                                                                                                            
----- ----                      -----                                                                                                                                                                                                                            
    1 abc                       {@{Site=abc; Host=abc123A}}                                                                                                                                                                                                      
    1 aab                       {@{Site=aab; Host=aab123B}}                                                                                                                                                                                                      
    1 bcd                       {@{Site=bcd; Host=bcd123C}}                                                                                                                                                                                                      
    1 def                       {@{Site=def; Host=def123A}}                                                                                                                                                                                                      
    3 abb                       {@{Site=abb; Host=abb123B}, @{Site=abb; Host=abb123A}, @{Site=abb; Host=abb123B}}               

如果您只希望每个“站点”中有一个“主持人”,请从每个组中选择第一个,如下所示:

select @{ Name = 'Site';  Expression = {$_.SubString(0,3)}}, @{ Name = 'Host';  Expression = {$_}} | Group-Object -Property Site | %{$_.Group[0].Host} 

哪个会给你这个:

abc123A
aab123B
bcd123C
def123A
abb123B

答案 2 :(得分:1)

PS C:\> $HostNames | Group {$_.SubString(0, 3)}

Count Name                      Group
----- ----                      -----
    1 abc                       {abc123A}
    1 aab                       {aab123B}
    1 bcd                       {bcd123C}
    1 def                       {def123A}
    3 abb                       {abb123B, abb123A, abb123B}

或者,如果您只想使用Name属性:

PS C:\> $HostNames | Group {$_.SubString(0, 3)} | Select -Expand Name
abc
aab
bcd
def
abb

答案 3 :(得分:0)

使用计算所得的属性将文件分组为substring(0,3),
过滤计数大于1且
的组 输出连接到字符串的组。

$Host |Group-Object {$_.Name.Substring(0,3)}| 
    Where-Object Count -gt 1| ForEach{
        "Prefix:{0} = {1}" -f $_.Name,($_.Group -join ',')
}

对文件夹中的输出进行采样,其中包含两个以tmux开头的文件

Prefix:tmu = tmux-client-5328.log,tmux-server-5330.log

$Hostnames = @"
abc123A
aab123B
bcd123C
def123A
abb123B
abb123A
abb123B
"@

$Hostnames -split '\r?\n' |Group-Object {$_.Substring(0,3)} | 
    Where-Object Count -gt 1| ForEach-Object {
      "Dublettes:{0} = {1}" -f $_.Name,($_.Group -join ',')}                                                                                                                        

Dublettes:abb = abb123B,abb123A,abb123B