Forum Linux.général Commande awk et expression reguliere pour extraire une adresse ip

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
11
fév.
2018

Bonjour,
Jé débute avec grep, curl, wget, awk et je cherche à extraire mon adresse ip récupéré sur le site monip.org.

Je fais donc :
wget http://monip.org --output-document moniphtml.txt
Puis j'ai la 6eme ligne de mon fichier qui est
IP : A.B.C.D

A, B, C, D pouvant faire entre 1 et 3 caractères.
Seriez-vous assez sympa pour me donner la commande awk ou grep pour extraire A.B.C.D de ce fichier?

Merci beaucoup! :)

  • # Re:

    Posté par  . Évalué à 6. Dernière modification le 11/02/18 à 18:08.

    cat moniphtml.txt | grep IP | cut -d "<" -f 4 | tr -d "BR>"
    curl -s monip.org | grep IP | cut -d "<" -f 4 | tr -d "BR>"
    curl ifconfig.me
    • [^] # Re:

      Posté par  . Évalué à 1.

      Je ne peux pas modifier mon message, je rajoute aussi:

      curl https://ifconfig.es/json

      ça te donne des informations supplémentaire.

      • [^] # Re:

        Posté par  . Évalué à 2.

        Je ne connaissais pas ifconfig.me ! C'est vrai que ça rend les choses beaucoup plus simples ^

    • [^] # Re:

      Posté par  . Évalué à 3.

      UUOC

  • # Pas la bonne méthode

    Posté par  . Évalué à 7. Dernière modification le 11/02/18 à 18:10.

    En sortie tu as une page HTML et c'est assez compliqué d'en extraire ce qui t'intéresse, surtout que aujourd'hui c'est la 4e ligne, mais si ça change demain ?

    Pour choper ton IP publique dans un script il existe d'autres services destinés spécialement à ça (pas besoin de s'embêter avec le parsing) :

    Un service comme http://ipinfo.io/ip te donnera une page non formatée HTML : uniquement l'IP. Tu as aussi des serveurs DNS qui te propose de répondre à ta question via la commande dig +short myip.opendns.com @resolver1.opendns.com

    En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

  • # OpenSP

    Posté par  . Évalué à 5.

    C'est en général une assez mauvaise idée d'utiliser des expressions rationnelle pour fouiller dans une page HTML.

    Ici la page est assez simple tu peux afficher la première IP trouvée sur chaque ligne avec

    awk 'match($0,/[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+/{print(substr($0,RSTART,RLENGTH))
    

    En général pour traiter du HTML ou plus généralement du SGML, on utilise OpenSP et plus précisément le programme onsgmls. Par exemple

    % curl https://monip.org | onsgmls 2>&-
    (HTML
    -\n
    (HEAD
    -    
    (TITLE
    -MonIP.org v1.0
    )TITLE
    -\n    
    AHTTP-EQUIV CDATA Content-type
    ACONTENT CDATA text/html; charset=UTF-8
    (META
    )META
    )HEAD
    -\n
    AALIGN CDATA center
    (P
    ASIZE CDATA 8
    (FONT
    (BR
    -IP : 89.0.149.201
    (BR
    )BR
    )BR
    )FONT
    ASIZE CDATA 3
    (FONT
    (I
    -xdsl-89-0-149-201.netcologne.de
    )I
    (BR
    )BR
    )FONT
    ASIZE CDATA 1
    (FONT
    (BR
    (BR
    -Pas de proxy détecté - No Proxy detected
    )BR
    )BR
    )FONT
    )P
    )HTML
    

    Sous cette forme canonique il est facile d'extraire l'IP recherchée, par exemple avec awk:

    awk -F ' *: *' '$1 == "-IP" {print($2)}'
    

    Ceci dit, si c'est un serveur que tu contrôles, tu pourrais lui apprendre à répondre avec du texte ou du JSON à la demande. Par exemple

    % curl -H 'Accept: application/json' https://monip.org
    {'ip':'89.0.149.201','dns':'xdsl-89-0-149-201.netcologne.de','proxy':false}
    

    Te fournirait un moyen bien plus fiable de récupérer une IP.

  • # Avec grep, sinon.

    Posté par  . Évalué à 4. Dernière modification le 12/02/18 à 12:17.

    L'un des sites donnés dans le premier commentaire te permet d'avoir directement ton IP sous forme de texte, épurée de tout le reste. Donc, ça résout le problème.

    Toutefois, si tu veux utiliser le lien que tu nous donnes et exploiter la page en l'état, plutôt que sed ou awk, le plus simple est d'utiliser grep, voire même egrep, avec l'option -o pour n'afficher que le motif reconnu, parce que l'adresse IP en notation décimale pointée (avec des points, donc, et pas des tirets dans le FQDN) n'apparaît qu'une fois sur la page. Du coup :

    curl monip.org 2> /dev/null | egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}'
    

    Sinon, en général, si la page est suffisamment bien écrite, tu peux la parser comme du XML avec xmllint --html et utiliser un chemin XPath pour aller directement cibler le nœud qui s'intéresse. Et si en plus, de l'autre côté, le webmaster a eu la présence d'esprit de le repérer avec un id explicite, alors tu n'auras plus jamais besoin de te soucier de savoir si la page a changé de présentation ou pas.

  • # ifconfig.me

    Posté par  (site Web personnel) . Évalué à 2.

    curl ifconfig.me

    • [^] # Re: ifconfig.me

      Posté par  . Évalué à 2.

      Déjà indiquée dans le tout premier commentaire…

  • # magnifique

    Posté par  . Évalué à 2.

    Magnifique, merci beaucoup pour vos contributions, j'ai de quoi m'amuser un moment avec toutes les alternatives :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.