#1 Le 29/12/2014, à 16:58
- Beuhlet_Reseau
Utilisation du IF dans un fichier
Bonjour à tous et à toutes
Voilà dans mon script qui est une succession de tests d'une puissance incroyable j'arrive à un souci.
Disons que mon fichier de référence (recensant toutes les machines du réseau) se trouve à un endroit connu (que j'ai déclaré au début de mon script). Sous la forme Hostref$serveur (la variable se modifiant en au fur et à mesure de la boucle).
Cela marchait en local vu que les différentes hostrefserveur du vlan2 était écrit en dur.
Mais disons que je voudrais faire en sorte (au lieu de devoir écrire toutes les hostrefserveur en dur càd plus de 50) qu'à ce niveau la :
if [ -f $hostref$serveur ]
then
[ect]
fi
Il aille piocher dans un fichier que m'a fournis mon admin (un fichier nommé hostre) réseau du style :
<IP> serveur
<IP> serveur
<IP> serveur ...
les informations nécessaires.
J'avais imaginé :
if [ grep $hostref$serveur | "hostref" ]
then
[ect]
fi
Suis-je perdu ?
Merci d'avance pour votre aide
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#2 Le 29/12/2014, à 18:53
- Hizoka
Re : Utilisation du IF dans un fichier
donne un exemple de ton fichier hostre (en modifiant les infos si besoin) e dis nous ce dont tu as besoin dedans.
et quand tu postes du code, utilise les balises [ code ]
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#3 Le 30/12/2014, à 00:50
- Cyrille_tux
Re : Utilisation du IF dans un fichier
Hello,
Est-ce que tu as essayé la commande "while" pour lire "ligne par ligne" le contenu de ton fichier ?
cat ${hostre} | while read Line
do
Server=$(echo ${Line} | awk '{print $2}')
...
done
Hors ligne
#4 Le 30/12/2014, à 02:04
- Watael
Re : Utilisation du IF dans un fichier
Hello,
uuoc!
uuoa (pour awk, XD)
que c'est laid.
while read -r ip servName reste
do
: des commandes avec "$servName"
done < fichierRef
c'est OK ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 30/12/2014, à 11:01
- Beuhlet_Reseau
Re : Utilisation du IF dans un fichier
Le fichier Host_ref ressemble à ceci (avec le chemin hostref=/script/host_ref/host_ref) :
# #######################################
# # FULLXX ##
# #######################################
10.xx.xx.xx cas105
10.xx.xx.xx cal105
10.xx.xx.xx cal205
10.xx.xx.xx cal305
10.xx.xx.xx caf105
10.xx.xx.xx caf205
10.xx.xx.xx cam015
##########################################################
Ect...
Dans la commande
if [ -f $hostref$serveur ]
then
[ect]
On associe à host_ref la variable du serveur en cours de test voilà pourquoi $hostref$serveur (qui donne host_refNomSrv).
Dans ma logique j'aurais aimé qu'au lieu d'avoir un truc bricolé comme j'ai fait c'est à dire écrire en dur dans le repertoire host_ref "host_refNomSrv host_refNomSrv host_refNomSrv [...]" je voudrais qu'il associe directement le nom de serveur à host_ref en cherchant la concordance dans le fichier host_ref si la machine existe bien dans celui ci
J'espère être un temps soit peu claire
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#6 Le 30/12/2014, à 11:21
- tiramiseb
Re : Utilisation du IF dans un fichier
Salut,
L'idéal pour qu'on soit tous sur la même longueur d'onde, c'est de faire ça en pseudocode, voire une description purement humaine. En gros, tu décris les différentes étapes de ton raisonnement avec des mots du langage courant, mais d'une manière logique et ordonnée...
Là pour ma part j'ai du mal à comprendre ce que tu veux faire. Mais d'autres ont peut-être mieux compris que moi.
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#7 Le 30/12/2014, à 11:44
- Beuhlet_Reseau
Re : Utilisation du IF dans un fichier
Je vais essayer car je suis un peu une machine le savait tu ?
Voici les chemins
############################
#hostref=/script/host_ref/host_ref #
############################
- Pour passer à la suite du test, nous allons tester l'existence de la machine
- L'existence de cette machine est définie dans un fichier texte (comme toutes les autres)
- Le test se compose de 2 "variables" :
#La variable $Host_ref
#La variable $NomSrv
- Les 2 rassemblés forment la base des tests unitaires
PS : Host_ref ci-dessus n'est pas à confondre avec un fichier c'est bien du texte ecris en dur (qui cache un fichier texte) qu'on va associé à une variable (voir chemin)
- La variable NomSrv est définie au tout début par une boucle qui lit ligne par ligne un fichier texte (nommé serveurs) comprenant l'ensemble des machines (leur nom d'hôte)
- Le fichier Host_ref comporte lui l'ensemble des machines (un peu comme le fichier serveurs) mais les associes à leur adresse IP (en plus de la petite partie host_ref qui se place devant)
Ce test compare en faite si la machine en cours de test est bien renseigné dans le référentiel.
Dernière modification par Beuhlet_Reseau (Le 30/12/2014, à 12:57)
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#8 Le 30/12/2014, à 15:45
- tiramiseb
Re : Utilisation du IF dans un fichier
Après relecture attentive de ton explication, il me semble avoir compris. Voici une reformulation de ton besoin, est-elle bonne ?
-> le fichier "serveurs" contient une liste de noms d'hôtes, chacun correspondant à un serveur, rien d'autre ;
-> le fichier "Host_ref" contient un référentiel, où chaque ligne contient deux éléments : une adresse IP et un nom de serveur ;
-> pour chaque serveur défini dans le fichier "serveurs" :
--> on regarde s'il existe dans le fichier "Host_ref" :
---> si ça existe dans le fichier "Host_ref", on affiche la ligne correspondante de "Host_ref" ;
---> si ça n'existe pas dans le fichier "Host_ref", on n'affiche rien.
Est-ce une bonne description du besoin ?
Si oui, alors c'est faisable avec la simple commande "grep".
➜ ~ cat serveurs
toto
titi
tutu
tata
tete
➜ ~ cat Host_ref
10.1.2.3 toto
10.2.3.4 titi
10.3.4.5 tutu
10.4.5.6 tyty
➜ ~ grep -f serveurs Host_ref
10.1.2.3 toto
10.2.3.4 titi
10.3.4.5 tutu
Cela nécessite qu'aucun nom de serveur ne puisse être contenu dans un autre nom de serveur (autrement dit, il ne peut pas y avoir "titi" et "tititi" en même temps).
Cela nécessite également qu'il n'y ait aucun commentaire dans aucun des deux fichiers.
Dernière modification par tiramiseb (Le 30/12/2014, à 15:47)
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#9 Le 30/12/2014, à 15:48
- tiramiseb
Re : Utilisation du IF dans un fichier
Ou alors, si tu veux faire une autre action plutôt que d'afficher le contenu, on peut faire la chose suivante :
cat serveurs | while read line
do
grep "$line" Host_ref
if [ $? -eq 0 ]
then
# Le serveur existe
bla bla bla
else
# Le serveur n'existe pas
bla bla bla
fi
done
Encore une fois, c'est très simpliste et soumis à contrainte, peut-être est-il nécessaire d'affiner pour coller à ton cas précis. Sans infos détaillées sur le contenu des fichiers, on aura du mal à te donner quelque chose de détaillé.
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#10 Le 30/12/2014, à 16:04
- Beuhlet_Reseau
Re : Utilisation du IF dans un fichier
Après relecture attentive de ton explication, il me semble avoir compris. Voici une reformulation de ton besoin, est-elle bonne ?
-> le fichier "serveurs" contient une liste de noms d'hôtes, chacun correspondant à un serveur, rien d'autre ;
-> le fichier "Host_ref" contient un référentiel, où chaque ligne contient deux éléments : une adresse IP et un nom de serveur ;
-> pour chaque serveur défini dans le fichier "serveurs" :
--> on regarde s'il existe dans le fichier "Host_ref" :
---> si ça existe dans le fichier "Host_ref", on affiche la ligne correspondante de "Host_ref" ;
---> si ça n'existe pas dans le fichier "Host_ref", on n'affiche rien.Est-ce une bonne description du besoin ?
Si oui, alors c'est faisable avec la simple commande "grep".
➜ ~ cat serveurs toto titi tutu tata tete ➜ ~ cat Host_ref 10.1.2.3 toto 10.2.3.4 titi 10.3.4.5 tutu 10.4.5.6 tyty ➜ ~ grep -f serveurs Host_ref 10.1.2.3 toto 10.2.3.4 titi 10.3.4.5 tutu
Cela nécessite qu'aucun nom de serveur ne puisse être contenu dans un autre nom de serveur (autrement dit, il ne peut pas y avoir "titi" et "tititi" en même temps).
Cela nécessite également qu'il n'y ait aucun commentaire dans aucun des deux fichiers.
C'est pour moi la réponse attendue. En effet :
-> pour chaque serveur défini dans le fichier "serveurs" :
--> on regarde s'il existe dans le fichier "Host_ref" :
---> si ça existe dans le fichier "Host_ref" : on passe à la suite du test
---> sinon (si ça n'existe pas dans le fichier "Host_ref") : echo le fichier referentiel est incomplet (=Fin du test)
Le test devant être transparent (mise à part les echos qui sont redirigés vers une console externe pour exploitation des données), je pense que ta deuxième solution me paraît plus convenable.
J'en viens à proposer sur ta contribution la chose suivante :
for serveur in `cat $PF.txt` (Je peut donc remplacer for serveur in `cat $PF.txt` par `cat $PF.txt` | while read serveur)
do
grep "$serveur" Host_ref (d'ailleur je ne devrais pas utiliser $Host_ref ?)
if [ $? -eq 0 ]
then
on passe a la suite
else
Probleme au niveau du referentiel
done
PS : je n'utilise pas line pour la simple réseau que la variable serveur que je déclarais dans for serveur in `cat $PF.txt` est utilisé ensuite dans le reste de mon script pour alimenter certains fichiers.
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#11 Le 30/12/2014, à 16:36
- tiramiseb
Re : Utilisation du IF dans un fichier
"$PF.txt", c'est quoi ? Un fichier dont le nom commence par un "$" ? Une variable "PF" à laquelle on accolle l'extension ".txt" ? Une variable qui s'appellerait "PF.txt" ?
"Host_ref" ou "$Host_ref", c'est quoi ? Le nom d'un fichier ? Une variable contenant un nom de fichier ?
(Je peut donc remplacer for serveur in `cat $PF.txt` par `cat $PF.txt` | while read serveur)
Presque. Sauf qu'il ne faut, dans ce cas, pas mettre les "backquotes", le cat n'est pas à exécuter dans un sous-shell.
----
En fait, tu veux d'abord valider que ta liste de serveurs ne contient bien que des serveurs existants avant de commencer le moindre traitement ?
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#12 Le 30/12/2014, à 16:44
- tiramiseb
Re : Utilisation du IF dans un fichier
S'il s'agit bien de vérifier si la liste de serveurs ne contient bien que des serveurs existants, alors je propose un truc de ce genre :
LISTE_SERVEURS="/tmp/liste_serveurs.txt"
REFERENTIEL_HOTES="/tmp/referentiel_hotes.txt"
if [ "$(wc -l "$LISTE_SERVEURS" | cut -d" " -f1)" -ne "$(grep -cf "$LISTE_SERVEURS" "$REFERENTIEL_HOTES")" ]
then
echo "Serveur manquant dans le réferentiel"
exit 1
fi
[...]
Encore une fois, cela nécessite qu'un nom n'apparaisse qu'une fois dans chacun des fichiers et qu'un nom ne puisse pas contenir un autre nom.
Cela nécessite aussi qu'il n'y ait pas de commentaire, pas de ligne vide, etc.
Si ce n'est pas faisable, alors finalement une boucle est alors peut-être bien nécessaire...
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#13 Le 14/01/2015, à 11:48
- Beuhlet_Reseau
Re : Utilisation du IF dans un fichier
Merci encore Seb pour tes conseils avisés qui m'ont grandement aidé dans l'élaboration de mon script.
J'aurais néanmoins une autre interrogation pour la communauté de Ubuntu.org, qui est la suivante :
- Certaines redirection de résultats vers le fichier csv peuvent être erronées suite à la présence de ponctuation mal venue qui viendrais corrompre le fichier .csv en questio.
- Le but serait de supprimer la ponctuation avec la commande Sed ou Awk avec l’appellation de la commande :punct: notamment.
Pour le moment l'écriture dans le fichier csv est basique comme le montre ma commande :
echo "$PF;$0;$serveur;NOK;Le fichier reference $hostref$serveur est absent;" >> $check_hosts
Mais certaines erreurs peuvents contenir des caractères du style ";" "/" ect..
J'avais pensé à ceci :
echo | awk -F [:punct:] {"$PF;$0;$serveur;NOK;Le fichier reference $hostref$serveur est absent;"} >> $check_hosts
Évidemment je ne gère pas vraiment l'utilisation de Awk donc si une personne voulait bien m'éclairer sur la syntaxe à utiliser pour appeler une fonction comme punct.
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#14 Le 14/01/2015, à 14:25
- tiramiseb
Re : Utilisation du IF dans un fichier
Je propose simplement d'encadrer chacun des champs avec des guillemets : a priori les guillemets protégeront les points-virgules dans les champs.
Tu peux essayer comme ça :
echo "\"$PF\";\"$0\";\"$serveur\";NOK;\"Le fichier reference $hostref$serveur est absent\";" >> $check_hosts
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#15 Le 15/01/2015, à 10:49
- Beuhlet_Reseau
Re : Utilisation du IF dans un fichier
Je te remercie je vais essayer sa !
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne