0

我有一个包含在 CSV 文件中的数千个 URL 的列表。它们是全长的,包括文件夹、变量等。我想生成一个域列表以供进一步分析。我找到了这个相关的 SO 线程,但我是 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。

4

2 回答 2

3

这是一个基于 alroc 显示的答案,但添加了使主机列表独一无二的答案:

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

打破这个:

  • $domains是将包含唯一主机列表的变量
  • gc是 Get-Content 的别名 - 它逐行读取文件
  • |管道)字符读取每一行gc并将其传递给下一个表达式
  • %是 ForEach-Object 的别名,并且$_是一个特殊变量,它保存每个正在沿管道传递的当前值(在本例中为 file.csv 中的一行文本)
  • New-Object使用来自 file.csv 的 URL创建Uri类的新实例
  • 括号()包裹了新对象,允许使用属性取消引用运算符.来访问 Uri 对象的Host属性。根据 MSDN 文档,此属性仅包含您所称的 URL 的“域”部分。
  • 然后将生成的主机通过管道传送到selectcmdlet(Select-Object 的别名),该 cmdlet 有一个-unique您可能猜到的开关,将通过它的值过滤为唯一/不同的值。

我希望这有帮助!

于 2013-09-25T03:00:20.297 回答
2

您确实需要遍历从文件中读取的每个项目(在最后两个示例中您没有这样做;您有点倒退)。

$hosts = Get-Content file.csv;
$hosts|ForEach-Object {$url = New-Object System.Uri $_;$url.Host};
于 2013-09-25T01:05:39.833 回答