web-dev-qa-db-fra.com

sed - Comment extraire une adresse IP en utilisant sed?

Ceci est pour une mission donc je n'ai pas d'autre choix que d'utiliser sed.

Étant donné un fichier messages , comment puis-je extraire toutes les adresses IP et les imprimer? 

J'ai d'abord essayé

sed -n '/((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])/p' messages

Mais cela n’imprimait rien. Après quelques recherches, j'ai découvert que sed ne supportait pas les opérateurs non-cupides comme? et | 

Je me suis fait mal au cerveau, mais je ne peux pas trouver un moyen de faire cela sans les opérateurs non avides. Comment puis-je faire ceci?

12
MrDiggles

Utilisez sed -r (regex étendu) ou échappez les groupes de capture avec \

7
Explosion Pills

grep conviendra mieux ici (si vous avez sed, vous devriez aussi avoir grep):

grep -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])' messages

Ceci est votre propre regex sans modification (testé OK)

25
Gilles Quenot

Si vous avez GNU sed, vous pouvez simplement ajouter le drapeau -r pour utiliser les ERE:

sed -rn '/((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])/p' file

Sinon, vous devrez échapper à certains caractères:

sed -n '/\(\(1\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\(1\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5]\)/p' file

Ces personnages incluent:

  • groupes utilisant des parenthèses: (, )
  • accolades d'occurrence: {, }
  • 'ou' tuyaux: |
  • points d'interrogation non-gourmands: ?

En règle générale (bien que ce ne soit pas votre cas), j’utilise les éléments suivants pour faire correspondre l’adresse IP:

sed -rn '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' file

Ou en mode de compatibilité:

sed -n '/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/p' file
9
Steve

Vous pouvez faire cela aussi:

Les fenêtres:

ipconfig | Perl -nle'/(\d+\.\d+\.\d+\.\d+)/ && print $1' | sed '2 d' | head -n1;

OSX:

ifconfig | Perl -nle'/(\d+\.\d+\.\d+\.\d+)/ && print $1' | sed '1 d' | head -n1;
0
Adrian Miranda