0

我在这里迷路了。我在制表符分隔的文本文件中有 20,000 行。其中一条线如下。我需要提取位于行尾附近的 ip 和用户名。我已经想出了如何剥离 ip 并将它们放入文本文件中,但是如何在同一个文本文件中获取用户名并保持该用户名与该行中的 ip 相关联?我已将代码放在底部。我想我有正确的正则表达式来提取 $Name 但我不确定......名字都是姓氏,名字

Mike Joung 8/21/2012 2:36 gdnwgx9495j;10.2.135.56;359;2013/11/13 08:21:13gdnm8xyydv1;10.2.135.20;1;2013/08/09 09:20:51gdnm592;10.2.132.205; 1;2012/08/30 13:26:42gdnw0225;10.2.132.229;1;2012/08/30 13:17:28gdnmh0lydv1;10.7.101.54;14;2012/07/27 01:15:37 6/12/ 2012 8:00 11/23/2009 5:26 Joung, Mike Never

    $input_path = ‘c:\ps\EMEA_wNotes_only.txt’
    $output_file = ‘c:\ps\extracted_ip_addresses.txt’
    $regex = ‘\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b’
    $Name = ‘\b[A-Za-z0-20._%-]+\b’
    select-string -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } > $output_file
4

1 回答 1

1

@KeithHill 在金钱上是对的Import-Csv,但是在查看您的示例行之后,我认为它不会那么简单。每一行的格式都一样吗?也就是说,每一行是否有相同数量的字段?从您的示例中看起来,您有几个字段,每个字段都由分号分隔的数据组成,用户名是倒数第二个制表符分隔的字段。

如果我在这里没有完全混淆自己,您可以利用 PowerShell 的一些漂亮的数组索引功能。

$input_path = ‘c:\ps\EMEA_wNotes_only.txt’
$output_file = ‘c:\ps\extracted_ip_addresses.txt’
$regex = ‘\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b’
Get-Content $input_path | % { $_ -split "`t" } | Select-Object @{Name="uname";Expression={$_[-2]}},@{Name="ips";Expression={($_ | Select-String -Pattern $regex -AllMatches) -Join ","}} | Export-Csv $output_file -NoTypeInformation

基本上,我们单独处理每一行,并在选项卡上手动将其拆分为一个数组,然后我们将倒数第二个项目拉出。(或数组末尾的任何数字。然后我们通过使用选择字符串查看其中的每个项目来转换该数组以提取 ips,用逗号连接 ips,清洗,冲洗并重复,然后将其全部导出到一个 cvs 文件。

cvs 文件应该类似于

User name,ip,ip,ip

但是 ips 可能会被引号包围,例如

User name,"ip,ip,ip"

我不记得了,我不能在这里在 iPad 上测试它;)希望这对一些人有所帮助。

于 2013-11-14T05:14:22.680 回答