Extraire IP d'un texte sous bash - Codes et scripts - Linux et OS Alternatifs
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
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
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.
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 ;/
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
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/' |
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,{
Marsh Posté le 07-09-2005 à 15:24:27
jlighty a écrit : Sinon il ne faudra pas oublier d' "échapper" les +,(,1,{ |
taist
sed 's/.* \([0-9]\+\(\.[0-9]\+\)\{3\}\).*/\1/' |
edit : bug spotted
sed 's/.* \([0-9]\+\(\.[0-9]\+\)\{3\}\).*/\1/'
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