Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 29/12/2014, à 16:58

Beuhlet_Reseau

Utilisation du IF dans un fichier

Bonjour à tous et à toutes cool

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 hmm


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.

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)

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é.

Hors ligne

#10 Le 30/12/2014, à 16:04

Beuhlet_Reseau

Re : Utilisation du IF dans un fichier

tiramiseb a écrit :

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 ?

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...

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

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