#1 Le 20/08/2012, à 15:16
- Ariania
Découpage de chaine de caractères et comparaison en SHELL [Résolu]
Bonjour,
Je voudrais faire un programme en SHELL.
Ce programme doit découper une chaine de caractères avec le séparateur ":" qui se trouve dans un fichier file.txt et aui est de la forme
[b]client:x.x.x.x[/b]
[b]client1:x.x.x.x[/b]
[b]client2:x.x.x.x[/b]
Jusqu'ici j'y arrive, j'ai le code suivant:
awk -F':' {print $1 }'
Ensuite je veux pouvoir comparer les adresses IP de chaque client entre eux et regrouper dans un fichier les clients qui ont la meme adresse IP (x.x.x.x).
Je ne sais pas comment comparer l'adresse IP de la 1ère ligne avec celle des autres lignes.
Merci d'avance pour vos réponses.
Cordialement,
Dernière modification par Ariania (Le 22/08/2012, à 10:23)
Hors ligne
#2 Le 20/08/2012, à 17:19
- Watael
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
salut,
en bash (>=4), avec un tableau associatif prenant comme indice l'adresse $IP (un tableau associatif doit être explicitement déclaré, voir help declare).
utilise une boucle while, vers laquelle est redirigé le contenu du fichier, et en redéfinissant l'IFS à : pour read qui lira les données dans deux variables: client et IP
si l'élément existe dans le tableau associatif, alors on ajoute (>>) le nom du $client au fichier $IP, autrement on crée le fichier en y redirigeant (>) le nom du $client.
c'est également faisable en tout awk pipé à sh.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 20/08/2012, à 17:34
- Hizoka
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
# Boucle traitant les lignes une à une du fichier
while read
do
# Recuperation du nom du client, on prend la ligne (${REPLY}) et on supprime tout à partir du :
client=${REPLY%%:*}
# Recuperation de l'ip, on prend la ligne (${REPLY}) et on supprime tout jusqu'au :
ip=${REPLY##*:}
# On envoie le nom du client dans un fichier au nom de l'ip
echo "${client}" >> "${ip}"
done < file
tout simplement... pas besoin de comparer...
ainsi il aura 1 fichier par ip avec dans le fichier la liste des client utilisant cette ip.
PS : Il n'y a pas les [ b ] et [ /b ] dans le fichier ?
Dernière modification par Hizoka (Le 20/08/2012, à 17:35)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#4 Le 20/08/2012, à 17:48
- Watael
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
tout simplement... pas besoin de comparer...
oui. j'ai été un peu tatillon sur la création du fichier $IP
while IFS=':' read client ip; do...
pas besoin de substitution.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 20/08/2012, à 18:04
- Hizoka
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
bien vu ! j'oublie toujours que la boucle peut récupérer plusieurs variables !
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#6 Le 21/08/2012, à 08:42
- credenhill
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
hello
le nom des fichiers est l'IP
awk -F"[][]|:" '{print $3 > $4}' file.txt
Dernière modification par credenhill (Le 21/08/2012, à 08:42)
Hors ligne
#7 Le 21/08/2012, à 09:58
- Ariania
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
Bonjour,
Merci à tous pour vos réponses. J'ai testé le code suivant:
#!/bin/bash
# Boucle traitant les lignes une à une du fichier
while IFS=':' read client ip;
do
# Recuperation du nom du client, on prend la ligne (${REPLY}) et on supprime t$
client=${REPLY%%:*}
# Recuperation de l'ip, on prend la ligne (${REPLY}) et on supprime tout jusqu$
ip=${REPLY##*:}
# On envoie le nom du client dans un fichier au nom de l'ip
echo "${client}" >> "${ip}"
done < file.txt
Mais j'ai cette erreur:
./Analyse.sh: line 13: : No such file or directory
./Analyse.sh: line 13: : No such file or directory
Je suppose que c'est parce que les fichiers ayant le nom des adresses IP ne sont pas crées? Est cela?
Merci d'avance pour vos autres réponses.
Cordialement,
Hors ligne
#8 Le 21/08/2012, à 10:01
- Ariania
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
hello
le nom des fichiers est l'IPawk -F"[][]|:" '{print $3 > $4}' file.txt
Excuse moi credenhill je n'ai pas compris ton code pourquoi mettre des [] ? Et surtout ou le mettre dans le code parce que j'utilise déjà awk pour séparer la chaine de caractère avec le séparateur ":"
Merci
Hors ligne
#9 Le 21/08/2012, à 10:19
- credenhill
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
[][] definit [ et ] comme séparateurs pour enlever b et /b
avec |: on définit 3 séparateurs
Hors ligne
#10 Le 21/08/2012, à 10:22
- Ariania
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
Mais je n'ai pas de b et /b je ne crois pas
Hors ligne
#11 Le 21/08/2012, à 11:01
- credenhill
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
je veux dire [b] et [/b]
voir ton premier post
Hors ligne
#12 Le 21/08/2012, à 11:04
- Ariania
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
Non je n'ai pas cela.
Mais au niveau de mon code j'ai une erreur peut on m'aider s'il vous plait.
Hors ligne
#13 Le 21/08/2012, à 11:07
- credenhill
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
et là ?
Bonjour,
Ce programme doit découper une chaine de caractères avec le séparateur ":" qui se trouve dans un fichier file.txt et aui est de la forme[b]client:x.x.x.x[/b] [b]client1:x.x.x.x[/b] [b]client2:x.x.x.x[/b]
Hors ligne
#14 Le 21/08/2012, à 11:14
- Zakhar
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
Attention à l'UTF-8
Si tu es susceptible d'avoir des chaînes de caractères UTF-8 (je veux dire en dehors du ASCII-7), la plupart des utilitaires GNU échouent (ou fonctionnent par effet de bord !)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#15 Le 21/08/2012, à 11:18
- credenhill
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
./Analyse.sh: line 13: : No such file or directory
./Analyse.sh: line 13: : No such file or directory
probablement qu'ip est
x.x.x.x[/b]
et il n'aime pas le /
Hors ligne
#16 Le 21/08/2012, à 12:07
- Ariania
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
Je viens de comprendre les et ce sont des erreurs de Frappe.
mon fichier est juste de ce type la
client:x.x.x.x
client1:x.x.x.x
client2:x.x.x.x
....
clientN:x.x.x.x
Et je pense que l'erreur vient du fait que le fichier n'a pas été crée
Hors ligne
#17 Le 21/08/2012, à 13:22
- credenhill
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
donc
awk -F":" '{print $1 > $2}' file.txt
ou
#!/bin/bash
# Boucle traitant les lignes une à une du fichier
while IFS=':' read client ip;
do
# On envoie le nom du client dans un fichier au nom de l'ip
echo "${client}" >> "${ip}"
done < file.txt
Dernière modification par credenhill (Le 21/08/2012, à 13:31)
Hors ligne
#18 Le 21/08/2012, à 14:13
- Ariania
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
Merci beaucoup pour votre réponse.
J'ai testé, cela fonctionne à merveille.
Mais j'ai une sortie comme cela dans les fichiers nommés par adresse IP.
client
test ...
Il y a un retour à la ligne et je voudrais juste que les noms soient séparés par une virgule comme cela client,test,...
Est ce possible?
Merci d'avance
Hors ligne
#19 Le 21/08/2012, à 14:32
- credenhill
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
il faut enlever la , après le dernier nom
awk -F":" '{ip[$2]=ip[$2] $1 "," } END{for(n in ip){sub(",$", "", ip[n]); print ip[n] > n}}' file.txt
## ou
awk -F":" '{printf $1 "," > $2}' file.txt ; sed -i 's/,$//g' *.*.*.*
Hors ligne
#20 Le 21/08/2012, à 14:55
- Hizoka
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
# Boucle traitant les lignes une à une du fichier
while IFS=':' read client ip;
do
# On envoie le nom du client dans un fichier au nom de l'ip
# Si le fichier ip n'existe pas on envoie une valeur sans virgule sinon on envoie une virgule precedant la valeur
[[ ! -f ${ip} ]] && echo -n "${client}" >> "${ip}" || echo -n ",${client}" >> "${ip}"
done < file.txt
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#21 Le 21/08/2012, à 14:56
- Ariania
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
Merci beaucoup le code fonctionne bien.
Je vous remercie tous pour vos réponses rapides et efficace.
Je voudrais avoir une autre information comment dois je supprimer tous les fichiers qui commence par 141.28.98.x
je dois mettre la commande rm -- 141.28.98
Car si je relance plusieurs fois le script il n'efface pas le contenu il continue a ècrire à la suite.
Hors ligne
#22 Le 21/08/2012, à 14:58
- pingouinux
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
Bonjour Ariania,
Pour info, tu as dû vouloir mettre le texte en gras dans ton premier message, mais ça ne marche pas entre balises-codes. D'où les [ b] et [ /b].
Hors ligne
#23 Le 21/08/2012, à 14:59
- Ariania
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
Bonjour Ariania,
Pour info, tu as dû vouloir mettre le texte en gras dans ton premier message, mais ça ne marche pas entre balises-codes. D'où les [ b] et [ /b].
Oui oui effectivement
Hors ligne
#24 Le 21/08/2012, à 14:59
- Hizoka
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
pour effacer tous les fichiers commencants par 141.28.98.
rm 141.28.98.*
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#25 Le 21/08/2012, à 15:02
- Ariania
Re : Découpage de chaine de caractères et comparaison en SHELL [Résolu]
pour effacer tous les fichiers commencants par 141.28.98.
rm 141.28.98.*
Merci beaucoup
Hors ligne