【问题标题】:Select next line after match is found using split使用 split 找到匹配后选择下一行
【发布时间】:2017-10-02 14:55:18
【问题描述】:

感谢阅读。

我在一个小的 powershell 脚本中工作.. 想法是解析这些信息

      Hostname:
    xxxxx-CS0,xxxx
    Network:
    IPv4 Address            = xxxxx
    IPv4 Netmask            = 255.255.254.0
    IPv4 Gateway            = xxxxx
    DNS Servers             = xxxxx
Hostname:
xxxxx,8.1.9-184
Network:
IPv4 Address            = xxxxx
IPv4 Netmask            = xxxxx
IPv4 Gateway            = xxxxxx
DNS Servers             = xxxxxx
Hostname:
xxxxxx,7.1.80-7
Network:
IPv4 Address            = xxxx
IPv4 Netmask            = xxxxx
IPv4 Gateway            = xxxxx
DNS Servers             = xxxxx

所以.. 我已经获得了所有信息,除非主机名带有此代码

  $info = Get-Content C:\xxxxxx\IP_info_all.txt

 write-host "Network Information VNX"



   ForEach ($network in $info)  {


   $hostname = ($network -split "`n")
   if($hostname -match "Hostname")
   {
   Write-Host $hostname
   $hostname =""
   }


     $b = ($network -split " ")[1]
     if ($b -match "Address") {
        $b
        $c = ($network -split "=")[1]
        $c
      if  ($name -match "IPv4"){
    $name
    $copyname =($network -split ":")[0]
     }
      }


     $b = ($network -split " ")[1]
     if ($b -match "Netmask") {
        $b 
         $maskid = ($network -split "=")[1]
         $maskid }

    $d = ($network -split " ")[1]
    if ($d -match "Gateway") {
            $d
     $Gatewayid = ($network -split "=")[1]
     $Gatewayid
     }


     $z = ($network -split " ")[1]
     $v = "DNS"
     if ($z -match "Servers") 
     {
     $v 
     $dnsserverid = ($network -split "=")[1,2,3]
     $dnsserverid
     }

输出给出了网络信息的名称和编号,但我不知道如何获取“主机名”字符串下的下一行。

我需要这样的输出:

Network Information VNX
Hostname:
Address
 xxxx
Netmask
 xxxx
Gateway
 xxxx
DNS
 xxxx
Hostname:

Address
 xxxx
Netmask
 xxxx

谢谢!

【问题讨论】:

  • 编辑了几次,但它应该能满足你的需要

标签: powershell text-parsing


【解决方案1】:

遍历每一行。设置条件语句时,加 1 表示我想像这样阅读下一行...

$info = Get-Content "C:\xxxxxx\IP_info_all.txt"
    write-host "Network Information VNX"
$content = ($info -split "`n") 

For($i=0;$i -lt $content.count;$i++){

    if($content[$i] -match "Hostname:")
    {
        "Hostname"
        Write-Host $content[$i+1]
    }
    elseif($content[$i] -match "Network:")
    {
        "Network"
        Write-Host ($content[$i]  -split "=")[1]
    }
    elseif($content[$i] -match "IPv4 Address")
    {
        "Address"
        Write-Host ($content[$i]  -split "=")[1]
    }
    elseif($content[$i] -match "IPv4 Netmask")
    {
        "Netmask"
        Write-Host ($content[$i] -split "=")[1]
    }
    elseif($content[$i] -match "IPv4 Gateway")
    {
        "Gateway"
        Write-Host ($content[$i] -split "=")[1]
    }
    elseif($content[$i] -match "DNS Servers")
    {
        "DNS Servers"
        Write-Host ($content[$i] -split "=")[1]
    }
}

【讨论】:

  • 输出是一样的:S
  • 我需要获取主机名输出,如下所示: xxxxx-CS0,xxxx 。所以如果我使用 0 或 1 的拆分,我仍然在同一行,我需要在“主机名”字符串下获取该行,我不知道这是否更清楚。感谢您的帮助
  • 是的,您的代码现在运行良好,但它仅适用于第一个内容,我需要解析 3000 行代码,这就是为什么我使用“if”来检查所有内容,已编辑主要问题是我需要的输出示例,只需要获取主机名:S
猜你喜欢
  • 1970-01-01
  • 2016-09-28
  • 2020-12-28
  • 1970-01-01
  • 2013-09-02
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
相关资源
最近更新 更多