web-dev-qa-db-fra.com

Comment extraire le nom de domaine de l'URL?

Comment extraire le nom de domaine d'une URL à l'aide de bash? Comme: http://example.com/ to example.com Doit fonctionner pour tout tld, pas seulement pour .com

31
Ben Smith

Vous pouvez utiliser un moyen AWK simple pour extraire le nom de domaine de la manière suivante:

echo http://example.com/index.php | awk -F[/:] '{print $4}'

SORTIE: example.com

:-)

66
Soj
basename "http://example.com"

Bien entendu, cela ne fonctionnera pas avec un URI comme celui-ci: http://www.example.com/index.html mais vous pouvez effectuer les opérations suivantes:

basename $(dirname "http://www.example.com/index.html")

Ou pour les URI plus complexes:

echo "http://www.example.com/somedir/someotherdir/index.html" | cut -d'/' -f3

-d signifie "délimiteur" et -f signifie "champ"; Dans l'exemple ci-dessus, le troisième champ délimité par la barre oblique "/" est www.example.com.

16
musashiXXX
$ URI="http://user:[email protected]:80/"
$ echo $URI | sed -e "s/[^/]*\/\/\([^@]*@\)\?\([^:/]*\).*/\2/"
example.com

voir http://en.wikipedia.org/wiki/URI_scheme

14
user300653
echo $URL | cut -d'/' -f3 | cut -d':' -f1

Fonctionne pour les URL:

http://Host.example.com
http://Host.example.com/hi/there
http://Host.example.com:2345/hi/there
http://Host.example.com:2345
9
keyoxy
#!/usr/bin/Perl -w
use strict;

my $url = $ARGV[0];

if($url =~ /([^:]*:\/\/)?([^\/]+\.[^\/]+)/g) {
  print $2;
}

Usage:

./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

Et si vous voulez juste le domaine et non le domaine complet + hôte, utilisez ceci:

#!/usr/bin/Perl -w
use strict;

my $url = $ARGV[0];
if($url =~ /([^:]*:\/\/)?([^\/]*\.)*([^\/\.]+\.[^\/]+)/g) {
  print $3;
}
7
Dark Castle

Au lieu d'utiliser regex pour cela, vous pouvez utiliser urlparse de python:

 URL=http://www.example.com

 python -c "from urlparse import urlparse
 url = urlparse('$URL')
 print url.netloc"

Vous pouvez soit l'utiliser comme ceci ou le mettre dans un petit script. Cependant, cela attend toujours un identifiant de schéma valide. En regardant votre commentaire, votre saisie n'en fournit pas nécessairement un. Vous pouvez spécifier un schéma par défaut, mais urlparse s'attend à ce que le netloc commence par '//':

url = urlparse ('// www.example.com/index.html','http')

Vous devrez donc les ajouter manuellement, c'est-à-dire:

 python -c "from urlparse import urlparse
 if '$URL'.find('://') == -1 then:
   url = urlparse('//$URL','http')
 else:
   url = urlparse('$URL')
 print url.netloc"
5
Garns
sed -E -e 's_.*://([^/@]*@)?([^/:]+).*_\2_'

par exemple.

$ 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:[email protected]:1234/some/path'
example.com

$ sed -E -e 's_.*://([^/@]*@)?([^/:]+).*_\2_' <<< 'http://user:[email protected]:1234/some/path#fragment'
example.com

$ sed -E -e 's_.*://([^/@]*@)?([^/:]+).*_\2_' <<< 'http://user:[email protected]:1234/some/path#fragment?params=true'
example.com
4
Armand

Ce qui suit va générer "example.com":

URI="http://[email protected]/foo/bar/baz/?lala=foo" 
Ruby -ruri -e "p URI.parse('$URI').Host"

Pour plus d'informations sur ce que vous pouvez faire avec la classe URI de Ruby, vous devez consulter la documentation .

3
Michael Kohl

il y a si peu d'informations sur la façon dont vous obtenez ces URL ... s'il vous plaît montrer plus d'informations la prochaine fois. Existe-t-il des paramètres dans l'URL, etc., etc., ..., en attendant, une simple manipulation de chaîne pour votre exemple d'URL

par exemple

$ 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

d'autres manières, en utilisant sed (GNU)

$ echo $s | sed 's/http:\/\///;s|\/.*||'
example.com

utiliser awk

$ echo $s| awk '{gsub("http://|/.*","")}1'
example.com
3
ghostdog74

Une solution qui couvrirait plus de cas serait basée sur les expressions rationnelles sed:

echo http://example.com/index.php | sed -e 's#^https://\|^http://##' -e 's#:.*##' -e 's#/.*##'

Cela fonctionnerait pour des URL telles que: http://example.com/index.php, http://example.com:4040/index.php, https://example.com/index.php

1
user3837712

Voici la manière de node.js, cela fonctionne avec ou sans ports et chemins profonds:

//get-hostname.js
'use strict';

const url = require('url');
const parts = url.parse(process.argv[2]);

console.log(parts.hostname);

Peut s'appeler comme:

node get-hostname.js http://foo.example.com:8080/test/1/2/3.html
//foo.example.com

Docs: https://nodejs.org/api/url.html

0
chovy

Avec Ruby, vous pouvez utiliser la bibliothèque/gem Domainatrix

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" 

excellent outil! :-)

0
Tilo