我有一个包含在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。
答案 0 :(得分:3)
这是一个基于alroc显示的答案,但增加了使主机列表唯一:
$domains = (gc file.csv)|%{(New-Object System.Uri $_).Host)|select -unique
打破这个局面:
$domains
是包含唯一主机列表的变量gc
是Get-Content的别名 - 它逐行读入文件gc
读取每一行并将其传递给下一个表达式$_
是一个特殊变量,它保存每个沿管道传递的当前值(文件中的一行文本。在这种情况下的csv)New-Object
使用file.csv中的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};