使用Powershell从URL列表中提取域

时间:2013-09-25 00:16:11

标签: powershell csv

我有一个包含在CSV文件中的数千个网址的列表。它们是全长的,包括文件夹,变量等。我想生成一个域列表以供进一步分析。我找到this relevant SO thread,但我是Powershell的新手,我没有看到如何在CSV线上进行迭代。

我的CSV只有一列:

http://something.net/prod/case_studies.asp
http://www.another.com/prod/group/gold/price_guarantee.asp
http://www.goodsite.co.uk/prod/case.asp?utm_source=google&utm_medium=search
http://wheel.net/prod/studious.asp
http://www.buystrop.com/gap/index.php?page_id=2345&group_id=9876

以下是我最终想要的结果:

something.net
www.another.com
www.goodsite.co.uk
wheel.net
www.buystrop.com

我已经尝试了几次在其他线程中找到的代码迭代,但还没有任何工作。要么我得到错误,要么输出是空白的。

修改 这是我到目前为止尝试过的代码:

$file = Get-Content 'file.csv'
$domains = ForEach ($p in $file) {select ([System.Uri]$p).Host}

没有错误,代码运行但$ domains为空。

$domains = ForEach-Object {$file | select-object [System.Uri]$file.Host}
$domains = ForEach-Object [System.Uri]$file.Host

这两个都给出一个错误,表明它正在查看整个文件,而不是遍历每一行。我现在已经尝试了几十种变体,我还没弄清楚如何解析每行中的URL。

2 个答案:

答案 0 :(得分:3)

这是一个基于alroc显示的答案,但增加了使主机列表唯一:

$domains = (gc file.csv)|%{(New-Object System.Uri $_).Host)|select -unique

打破这个局面:

  • $domains是包含唯一主机列表的变量
  • gc是Get-Content的别名 - 它逐行读入文件
  • | (管道)字符从gc读取每一行并将其传递给下一个表达式
  • 是ForEach-Object的别名,$_是一个特殊变量,它保存每个沿管道传递的当前值(文件中的一行文本。在这种情况下的csv)
  • New-Object使用file.csv中的URL
  • 创建Uri类的新实例
  • 括号()包装新对象,允许使用属性解除引用运算符来访问Uri对象的Host属性。根据MSDN文档,此属性仅包含URL中的“域”部分。
  • 然后将生成的主机通过管道传输到select cmdlet(Select-Object的别名),其中有一个开关-unique正如您所猜测的那样,过滤掉通过它的值只是唯一的/ distinct values。

我希望这有帮助!

答案 1 :(得分:2)

您确实需要遍历从文件中读取的每个项目(您在最后两个示例中未执行此操作;您可以向后执行此操作)。

$hosts = Get-Content file.csv;
$hosts|ForEach-Object {$url = New-Object System.Uri $_;$url.Host};