如何使用powershell从txt文件中获取特定单词

时间:2017-03-22 15:42:18

标签: powershell

我的一个hostraws.txt文件显示如下数据,我想在修剪后存在最后一个IP(10.110.20.77)。

| df1b0d4d-e240-49b2-aa6f-6ea878f696eb | Test-15-my_i-v2deggvdmd3g | ACTIVE | blcos10a-private = 10.106.15.104,10.110.20.77 | |

我该怎么做?有人可以帮帮我吗?

我只想要IP“10.110.20.77”

我尝试了三个mthords来获取IP.below是我尝试过的方法。当我尝试时,第一个方法,以及IP,我得到了“|”也

$hosts = Get-Content C:\hostraws.txt

foreach ($line in $hosts)
    {
    $split1 = $line.trim("|")
    $split2 = $split1.Split(",")[1]
    echo $split2 >> C:\ipaddress.txt
    }

我的输出为 10.110.20.77 |

我如何才能获得IP?

我试过下面的第二个方法

foreach ($line in $hostsraw)
    {
    $split1 = $line.split('|')
echo $split1
    $split2 = $split1.Split('|')[4]
    echo $split2 
    }

Split1显示输出

df1b0d4d-e240-49b2-aa6f-6ea878f696eb
 Test-15-my_i-v2deggvdmd3g
 ACTIVE


 blcos10a-private=10.106.15.104, 10.110.20.77

split1输出中有一个空格。当我回显$ split2时,根本没有输出

当我使用第三个方法时,我多次获得相同的IP地址,并且在PowerShell窗口中也出现错误

$hosts = Get-Content C:\hostraws.txt

foreach ($line in $hosts)
    {
    $split1 = $line.Split(',')[1]
    $split2 = $split1.Split(' ')[1]
    $split2 >> C:\ipaddress.txt 
    }

错误

You cannot call a method on a null-valued expression.
At line:4 char:5
+     $split2 = $split1.Split(' ')[1]
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

You cannot call a method on a null-valued expression.
At line:4 char:5
+     $split2 = $split1.Split(' ')[1]
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

You cannot call a method on a null-valued expression.
At line:4 char:5
+     $split2 = $split1.Split(' ')[1]
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

You cannot call a method on a null-valued expression.
At line:4 char:5
+     $split2 = $split1.Split(' ')[1]
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

You cannot call a method on a null-valued expression.
At line:4 char:5
+     $split2 = $split1.Split(' ')[1]
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

这就是hostsrwa.txt内容的存在方式.ipsddress信息不在同一行,它在第二行。

hostsrwa.txt screenshot attached here

3 个答案:

答案 0 :(得分:1)

$input = "| df1b0d4d-e240-49b2-aa6f-6ea878f696eb | Test-15-my_i-v2deggvdmd3g | ACTIVE | blcos10a-private=10.106.15.104, 10.110.20.77 | |"

$partial = $string.Substring($string.IndexOf(",")+2)
$partial.Substring(0, $a.IndexOf(" "))   
#result: 10.110.20.77

第一步是在变量$input中分配值。由于powershell自动转发数据类型,我们可以调用Substring()IndexOf()等字符串的方法。

此解决方案不起作用时(字符串连接)

当从开始到原始的“,”将出现更多或相等的1次

",,,,,, | ACTIVE | blcos10a-private=10.106.15.104, 10.110.20.77 | |" #fail
"| ACTIVE | blcos10a-private=10.106.15.104, 10.110.20.77 ,,,| |" #ok

第一次出现,

时所需IP的不同位置
"| ACTIVE | blcos10a-private=10.106.15.104,         10.110.20.77 | |" #fail

如果在IP之后空格不正确

"| ACTIVE | blcos10a-private=10.106.15.104, 10.110.20.77|      |" #fail

答案 1 :(得分:0)

这很丑陋,但您可以使用附带图片中的示例来解析您的文本行。它的工作原理如下:在管道符号处拆分,返回索引4上的行(基于零),在空格字符处拆分,并返回索引2.图像中的最后一行是不必要的。它的唯一目的是表明它只返回IP而不是IP地址两侧的任何额外空格。

enter image description here

编辑:如果你能做到一次,你总是可以把它放在循环中。考虑我的stackfile.txt文件有四个条目。使用下图中的循环示例将获得每个IP地址。

enter image description here

正如所建议的,这里是图像中的代码。第一节中的最后两个在数字2周围丢失了方括号。

$FileContent = Get-Content -Path .\Desktop\stackfile.txt
Foreach ($Line in $FileContent) {
    $Line.Split('|')[4].Split(' ')[2]
}

{{1}}

注意:。\ Desktop \ stackfile.txt包含四行,其中IP为10.111.20.77,10.112.20.78,10.113.20.79和10.114.20.80

答案 2 :(得分:0)

您可以尝试的是,首先,看看您希望第一次拆分的位置,似乎只有,的一个实例,您需要该IP地址,所以......

$split1 = $line.Split(',')[1]

这将创建10.110.20.77 | |的捕获并将其存储在$split1

现在你可以用空格分割它并再次选择第一个实例:

$split2 = $split1.Split(' ')[1]

这将创建10.110.20.77的捕获并将其存储在$split2

$hosts = Get-Content C:\hostraws.txt

ForEach ($line in $hosts)
    {
    #split by comma and take first instance
    $split1 = $line.Split(',')[1]

    #split by whitespace and take first instance
    $split2 = $split1.Split(' ')[1]

    #Append to file
    $split2 >> C:\ipaddress.txt
    }

我已对上述内容进行了测试,并使其与您的编码风格类似。这将完全按照您的要求生成,只要hostraws.txt中的每一行都采用相同的格式。