如何使用bash从网址中提取域名? 喜欢:http://example.com/到example.com 必须适用于任何tld,而不仅仅是.com
答案 0 :(得分:68)
您可以使用简单的AWK方式提取域名,如下所示:
echo http://example.com/index.php | awk -F[/:] '{print $4}'
输出:example.com
: - )
答案 1 :(得分:17)
basename "http://example.com"
现在当然,这不适用于这样的URI:http://www.example.com/index.html
但您可以执行以下操作:
basename $(dirname "http://www.example.com/index.html")
或者更复杂的URI:
echo "http://www.example.com/somedir/someotherdir/index.html" | cut -d'/' -f3
-d表示“分隔符”,-f表示“字段”;在上面的示例中,由正斜杠'/'分隔的第三个字段是www.example.com。
答案 2 :(得分:14)
$ URI="http://user:pw@example.com:80/"
$ echo $URI | sed -e "s/[^/]*\/\/\([^@]*@\)\?\([^:/]*\).*/\2/"
example.com
答案 3 :(得分:10)
echo $URL | cut -d'/' -f3 | cut -d':' -f1
适用于网址:
http://host.example.com
http://host.example.com/hi/there
http://host.example.com:2345/hi/there
http://host.example.com:2345
答案 4 :(得分:7)
#!/usr/bin/perl -w
use strict;
my $url = $ARGV[0];
if($url =~ /([^:]*:\/\/)?([^\/]+\.[^\/]+)/g) {
print $2;
}
用法:
./test.pl 'https://example.com'
example.com
./test.pl 'https://www.example.com/'
www.example.com
./test.pl 'example.org/'
example.org
./test.pl 'example.org'
example.org
./test.pl 'example' -> no output
如果你只是想要域而不是完整的主机+域,请改用:
#!/usr/bin/perl -w
use strict;
my $url = $ARGV[0];
if($url =~ /([^:]*:\/\/)?([^\/]*\.)*([^\/\.]+\.[^\/]+)/g) {
print $3;
}
答案 5 :(得分:6)
sed -E -e 's_.*://([^/@]*@)?([^/:]+).*_\2_'
e.g。
$ sed -E -e 's_.*://([^/@]*@)?([^/:]+).*_\2_' <<< 'http://example.com'
example.com
$ sed -E -e 's_.*://([^/@]*@)?([^/:]+).*_\2_' <<< 'https://example.com'
example.com
$ sed -E -e 's_.*://([^/@]*@)?([^/:]+).*_\2_' <<< 'http://example.com:1234/some/path'
example.com
$ sed -E -e 's_.*://([^/@]*@)?([^/:]+).*_\2_' <<< 'http://user:pass@example.com:1234/some/path'
example.com
$ sed -E -e 's_.*://([^/@]*@)?([^/:]+).*_\2_' <<< 'http://user:pass@example.com:1234/some/path#fragment'
example.com
$ sed -E -e 's_.*://([^/@]*@)?([^/:]+).*_\2_' <<< 'http://user:pass@example.com:1234/some/path#fragment?params=true'
example.com
答案 6 :(得分:5)
您可以使用python的urlparse:
而不是使用正则表达式来执行此操作 URL=http://www.example.com
python -c "from urlparse import urlparse
url = urlparse('$URL')
print url.netloc"
您可以像这样使用它,也可以将它放在一个小脚本中。但是,这仍然需要一个有效的方案标识符,查看您的注释,您的输入不一定提供。您可以指定默认方案,但urlparse期望netloc以'//'
开头:
url = urlparse('// www.example.com/index.html','http')
所以你必须手动前置,即:
python -c "from urlparse import urlparse
if '$URL'.find('://') == -1 then:
url = urlparse('//$URL','http')
else:
url = urlparse('$URL')
print url.netloc"
答案 7 :(得分:4)
关于如何获得这些网址的信息很少...请在下次显示更多信息。在网址等有参数...... 同时,只需对您的示例网址进行简单的字符串操作
例如
$ s="http://example.com/index.php"
$ echo ${s/%/*} #get rid of last "/" onwards
http://example.com
$ s=${s/%\//}
$ echo ${s/#http:\/\//} # get rid of http://
example.com
其他方式, 使用sed(GNU)
$ echo $s | sed 's/http:\/\///;s|\/.*||'
example.com
使用awk
$ echo $s| awk '{gsub("http://|/.*","")}1'
example.com
答案 8 :(得分:3)
以下将输出“example.com”:
URI="http://user@example.com/foo/bar/baz/?lala=foo"
ruby -ruri -e "p URI.parse('$URI').host"
有关使用Ruby的URI类可以做些什么的更多信息,您必须咨询the docs。
答案 9 :(得分:1)
一个涵盖更多案例的解决方案将基于sed regexp:
echo http://example.com/index.php | sed -e 's#^https://\|^http://##' -e 's#:.*##' -e 's#/.*##'
这适用于以下网址:
http://example.com/index.php, http://example.com:4040/index.php, https://example.com/index.php
答案 10 :(得分:0)
使用Ruby,您可以使用Domainatrix库/ gem
http://www.pauldix.net/2009/12/parse-domains-from-urls-easily-with-domainatrix.html
require 'rubygems' require 'domainatrix' s = 'http://www.champa.kku.ac.th/dir1/dir2/file?option1&option2' url = Domainatrix.parse(s) url.domain => "kku"
很棒的工具! : - )
答案 11 :(得分:0)
这里是node.js方式,它可以使用或不使用端口和深层路径:
//get-hostname.js
'use strict';
const url = require('url');
const parts = url.parse(process.argv[2]);
console.log(parts.hostname);
可以像:
一样调用node get-hostname.js http://foo.example.com:8080/test/1/2/3.html
//foo.example.com