【问题标题】:Extract domains from a Zone file [closed]从区域文件中提取域[关闭]
【发布时间】:2017-01-08 17:04:24
【问题描述】:

我有这种格式的文件

81535883v2a1.hbrxly.com,a,209.99.40.222
81535883v2a1.hbrxly.com,ns,dns10.parkpage.foundationapi.co
81535883v2a1.hbrxly.com,txt,|v=spf1 a -all
81535883v2a1.nsmodel.com,a,23.245.38.79
81535883v2a1.panbao.net,cname,p.dcoin.co
81535883v2a1.sznissei.com,a,23.224.47.73
81535883v2a1.tauri.com.cn,a,23.244.110.119
81535883v2a1.vemega.net,a,103.232.215.133

我想把它提取成这样的东西(仅限第一行和域)

hbrxly.com
hbrxly.com
hbrxly.com
nsmodel.com
panbao.net
sznissei.com
tauri.com
vemega.net

我尝试过使用 sed,awk,grep 但仍然无法正常工作。不知道,希望有人能帮忙。

【问题讨论】:

  • 解决此问题的最佳方法是将正则表达式与 re 模块一起使用。我的正则表达式很生疏,但这可能有效:url = re.compile(r'.+\.([A-Za-z0-9]+\.[com|ne t]{3}).+$')url.findall(line)。有人可能会想出一个更合适的字符串。
  • 你真的希望81535883v2a1.tauri.com.cn 畸形成tauri.com吗?
  • @JamesBrown : echo 81535883v2a1.tauri.com.cn |awk -F, '(d=gensub(/^.*\.([^.]+\.[^.]+)$/,"\\1","g",$1)) && !seen[d]++ {print d}' com.cn
  • 嗯,是吗? OP 是否需要格式错误的输出,即 *.tauri.com.cn 打印问题中的 tauri.com 还是他想要正确的信息?
  • 嗯..不确定。虽然tauri.com.cn 对我来说更有意义。让 OP 来决定。

标签: python bash perl awk sed


【解决方案1】:
awk -F'[.,]' '{print $2,$3}' OFS="." file

hbrxly.com
hbrxly.com
hbrxly.com
nsmodel.com
panbao.net
sznissei.com
tauri.com
vemega.net

【讨论】:

  • 谢谢先生!现在解决问题
【解决方案2】:
$ sed 's/[^.]*\.\([^,]*\).*/\1/' file
hbrxly.com
hbrxly.com
hbrxly.com
nsmodel.com
panbao.net
sznissei.com
tauri.com.cn
vemega.net

【讨论】:

  • 谢谢先生,辛苦了!
【解决方案3】:
$ grep -oP '^[^.]+\.\K[^.]+\.[^.,]+' ip.txt 
hbrxly.com
hbrxly.com
hbrxly.com
nsmodel.com
panbao.net
sznissei.com
tauri.com
vemega.net

如果您需要高达,的字符串

$ grep -oP '^[^.]+\.\K[^,]+' ip.txt 
hbrxly.com
hbrxly.com
hbrxly.com
nsmodel.com
panbao.net
sznissei.com
tauri.com.cn
vemega.net

【讨论】:

  • 谢谢先生!工作完美.. 让它自动排序和删除重复域怎么样?
【解决方案4】:
awk -F, '{sub(/^[^.]*\./,"",$1)} {print $1}' infile
hbrxly.com
hbrxly.com
hbrxly.com
nsmodel.com
panbao.net
sznissei.com
tauri.com.cn
vemega.net

对于唯一的域名。

awk -F, '{sub(/^[^.]*\./,"",$1)} {print $1}' infile |sort -u

或者按照 sp asic 的建议

awk -F, '{sub(/^[^.]*\./,"",$1)} !seen[$1]++{print $1}'  infile

【讨论】:

  • 谢谢兄弟!工作也很好,如何让它自动排序和删除重复的域?
  • 只需在命令末尾添加sort -u
  • @soFan,或者修改awk命令本身..awk -F, '{sub(/^[^.]*\./,"",$1)} !seen[$1]++{print $1}'
  • @spasic 谢谢,我很懒 :)
【解决方案5】:

使用 Perl:

perl -ne ' use strict; use warnings; $_ =~ m/(.*?)\.(.*?),(.*)/g; {print $2, "\n"}' file

输出

hbrxly.com
hbrxly.com
hbrxly.com
nsmodel.com
panbao.net
sznissei.com
tauri.com.cn
vemega.net

【讨论】:

  • 谢谢!感谢您的回答。像魅力一样工作。
【解决方案6】:

在 GNU awk 中。它只打印每个域的第一次出现,也适用于host.subdomain.domain.tldn 等地址。

$ awk -F, '(d=gensub(/^.*\.([^.]+\.[^.]+)$/,"\\1","g",$1)) && !seen[d]++ {print d}' file
hbrxly.com
nsmodel.com
panbao.net
sznissei.com
com.cn
vemega.net

如果您还想要子域(即除了主机名之外的所有内容),那么:

$ awk -F, '(d=gensub(/^[^.]+\.(.+)$/,"\\1","g",$1)) && !seen[d]++ {print d}' file
hbrxly.com
nsmodel.com
panbao.net
sznissei.com
tauri.com.cn
vemega.net

【讨论】:

  • 我只是尝试仍然无法正常工作,如果我也可以获取子域,这是非常好的主意。无论如何,感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 2016-09-28
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多