Regex 通过正则表达式从行中拆分特定字符串
我一直在尝试提取某些等于Regex 通过正则表达式从行中拆分特定字符串,regex,powershell,split,Regex,Powershell,Split,我一直在尝试提取某些等于40的值,并使用PowerShell从.txt文件的多行中获取最后六个字 到目前为止,我有以下代码: $file = Get-Content 'c:\temp\file.txt' $Array = @() foreach ($line in $file) { $Array += $line.split(",")[6] } $Array $Array | sc "c:\temp\export2.txt" Txt文件:(可能是重复的行,如hostname01) 这就是我想要
40
的值,并使用PowerShell从.txt文件的多行中获取最后六个字
到目前为止,我有以下代码:
$file = Get-Content 'c:\temp\file.txt'
$Array = @()
foreach ($line in $file)
{
$Array += $line.split(",")[6]
}
$Array
$Array | sc "c:\temp\export2.txt"
Txt文件:(可能是重复的行,如hostname01)
这就是我想要的:
hostname01
hostname02
hostname03 developer host
您可以使用非捕获组查看字符串的正确格式,并使用第一个捕获组引用6元素的名称
$1
:
(?:\d+,\d,\d,\d,[A-Z]+,[A-Z]+,)([a-zA-Z 0-9]+)
-指定一个非捕获组(这意味着它不是通过$1或$2引用的,就像您通常使用捕获组一样)(?:)
(我不会重复所有这些,但是)查找后跟文字的一个或多个数字\d+,
,
-查找全大写字母字符串,后跟文字[A-Z]+,
(出现两次),
- ([a-zA-Z 0-9]+)-您要查找的捕获组,$1,它将捕获所有字符
、a-Z
、空格和数字,直到不在此集中的字符(在本例中为逗号)。提供您要查找的文本a-Z
Get-Content 'c:\temp\file.txt' | Foreach-Object {($_ -split ',')[6]} | Select-Object -Unique
下面的内容应该与您正在尝试的内容配合使用
Get-Content 'c:\temp\file.txt' | %{
$_.Split(',')[6]
}| select -Unique
这不是一个快速的解决方案,而是一个方便灵活的解决方案:
- 由于文本文件实际上是CSV文件,因此可以使用
导入CSV
- 由于您的数据缺少标题行(列名),我们可以通过其
参数将其提供给-header
导入Csv
- 由于您对列编号
(主机名)和7
(其值应为14
)感兴趣,我们需要为列1到14提供列名称(由我们选择)40
- 由于您的数据缺少标题行(列名),我们可以通过其
可以方便地将Csv行转换为(自定义)对象,您可以使用导入Csv
查询其属性,并使用Where Object
有选择地提取;添加选择对象
会抑制重复值-Unique
Import-Csv c:\temp\file.txt -Header (1..14) |
Where-Object 14 -eq 40 |
Select-Object -ExpandProperty 7 -Unique
为方便起见,我们使用范围表达式(1..14
)命名了列1
,2
,…但您可以自由使用描述性名称
假设c:\temp\file.txt
包含您的示例数据,则上述结果为:
hostname01
hostname03 developer host
要输出到文件,请将上述内容通过管道传输到设置内容
,如您的问题所示:
... | Set-Content c:\temp\export2.txt
但我会提取某些等于40的值来得到最后的第六个字。恐怕我不明白你的意思。对不起。我的意思是,我只想捕获属于
40
值的行,例如4626898,0,3,0,POL,INCR,hostname01,xx,15494298090000005071549430316,xxx,0,40
,1,xxxx,518708345040100。有一个关于代码的速度相关后续问题。
... | Set-Content c:\temp\export2.txt