Extraire IP d'un texte sous bash

Extraire IP d'un texte sous bash - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 07-09-2005 à 09:34:17    

Hello à tous.
 
Je lance une commande sur mon Linux qui est :  
cat /var/log/messages | grep -i "Failed Password"  
 
Ceci me donnera une ligne du style :
Sep  6 23:15:57 serveur sshd[8591]: Failed password for root from xxx.xxx.xxx.xxx port xxxxx ssh2
 
Mon problème est que j'aimerai extraire "xxx.xxx.xxx.xxx" de cette chaîne.
 
Je me suis déjà heurté à 'sed' et 'awk' mais sans succès ;(.
 
J'ai également recherché sur le forum mais je n'ai rien trouvé.  
 
Merci d'avance pour votre aide


Message édité par bisol le 07-09-2005 à 09:49:10
Reply

Marsh Posté le 07-09-2005 à 09:34:17   

Reply

Marsh Posté le 07-09-2005 à 09:59:33    

Salut, je connais rien à awk, mais en cherchant un peu j'ai appris que :
 
a="Sep  6 23:15:57 serveur sshd[8591]: Failed password for root from xxx.xxx.xxx.xxx port xxxxx ssh2"
echo $a |  awk '{print $11}'
 
devrait marcher car awk gardera le 11ième champ de la ligne en question (ça marche j'ai testé).
 
Donc quelque chose comme cat /var/log/messages | grep -i "Failed Password" |  awk '{print $11}' devrait fonctionner.
 
Après c'est peut être moche comme méthode (notamment si le nombre de champs varient...)
 
Jérem

Reply

Marsh Posté le 07-09-2005 à 10:07:30    

Effectivement le nombre de champs varient car je peux avoir une variante (ta technique marche pour mon exemple). La variante :
Failed password for invalid user user from 221.12.29.103 port 53583 ssh2
 
Je vais faire une solution pas très belle avec ca temporairement ;)
 
Merci

Reply

Marsh Posté le 07-09-2005 à 11:34:35    

une regexp devrait faire l'affaire :
s/\([0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\)/\1/
en gros on cherche un ou plusieurs chiffres suivie d'un point, on sélectionne jusqu'à ce que l'on trouve un espace.
Je ne suis pas sûr que ça marche à tester avec sed.


Message édité par jlighty le 07-09-2005 à 11:51:39
Reply

Marsh Posté le 07-09-2005 à 13:48:23    

cat /var/log/messages | grep -i "Failed password for root" | sed s/\{[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\)/\1/
 
Ca me retourne  
Sep  6 23:15:57 serveur sshd[8591]: Failed password for root from 221.12.29.103 port 53958 ssh2
 
Alors que ca dervait que prendre l'IP ;/

Reply

Marsh Posté le 07-09-2005 à 14:52:33    

la nouvelle version qui marche :
 sed "s/..* \([0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\)..*/\1/"
avec ça, tu auras directement l'adresse IP

Reply

Marsh Posté le 07-09-2005 à 15:11:42    

Dans une regex, '{1,}' s'écrit aussi '+'.
 
'*' veut dire "0 ou plus", donc '..*'  s'écrit aussi '.+'. Mais ici, je ne vois pas l'intéret de matcher au moins un caractère avant et après l'ip ?
 
donc, version raccourcie :

sed 's/.* \([0-9]\+\(\.[0-9]\+\)\{3\}\).*/\1/'


Reply

Marsh Posté le 07-09-2005 à 15:20:35    

Ne connaissant que les bases des regex j'ai jamais utilisé les +

Citation :

Mais ici, je ne vois pas l'intéret de matcher au moins un caractère avant et après l'ip ?


erreur de ma part, surtout si l'IP est placé en fin de chaine ça peut être problématique.
Sinon il ne faudra pas oublier d' "échapper"  les +,(,1,{

Reply

Marsh Posté le 07-09-2005 à 15:24:27    

jlighty a écrit :

Sinon il ne faudra pas oublier d' "échapper"  les +,(,1,{

[:pingouino]
taist  

sed 's/.* \([0-9]\+\(\.[0-9]\+\)\{3\}\).*/\1/'


 
edit : bug spotted :D  
 
sed 's/.* \([0-9]\+\(\.[0-9]\+\)\{3\}\).*/\1/'


Message édité par Pillow le 07-09-2005 à 15:25:00
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed