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 17/09/2010, à 18:30

Lyralia

[Résolu] Rechercher paramètre dans un fichier texte

Bonjour,

Je galère depuis un moment sur un truc tout bête... (les scripts shell, c'est vraisemblablement pas mon truc). Ce serait vraiment un grand soulagement si quelqu'un pouvait m'aiguiller !

Mon problème, globalement :
Je souhaite lancer une succession de programmes les uns à la suite des autres. Pour ça, j'ai pensé faire un script qui les exécute un par un. Jusque là, pas de problème. Ca marche.

Là où ça se complique, c'est que j'aimerais, finalement, pour l'une de ces applications, aller chercher le chemin d'accès dans un fichier de config plutôt que de l'avoir en dur dans mon script bash.

Il y a pas mal de choses dans ce fichier, mais ce qui m'intéresse, c'est une ligne particulière où je vais avoir :

nwpath:    /mon/chemin/d/acces

(Entre le nwpath: et le chemin d'accès, ça n'est pas un espace mais une tabulation)

Ou /mon/chemin/d/acces correspond au chemin de l'appli que je souhaite lancer. Donc : je voudrais parcourir ce fichier de config, rechercher la ligne où j'ai "nwpath:" et récupérer le chemin d'accès qu'il y a derrière la tabulation pour pouvoir l'utiliser dans mon script !

Fabuleux, n'est-ce pas? Oui oui, je sais, ça ne casse pas trois pattes à un canard. Mais il n'empêche que je n'y arrive pas.

J'ai bien essayé avec un cat | grep "^nwpath:" config.ini mais ça n'a pas l'air de faire ce à quoi je m'attendrais. (Il me retourne la chaine "nwpath:    /mon/chemin/d/acces" entière qu'il me faudrait encore découper. Et je pense que cat n'est pas la commande appropriée non plus vu que ça me fait des trucs bizarres dans ma console tongue)

J'ai aussi essayé d'utiliser set mais alors là c'est peine perdue parce que je ne comprends ni comment ni pourquoi ça marche (pas).

Vous l'aurez compris, sur une échelle de A à Z, où Z serait le plus haut degré de maîtrise du shell... je dois être à peu prés au B. B et demi, disons.

Y aurait-il une bonne âme pour :
- Me donner la solution ! Ou juste me donner une bonne grosse piste pour me remettre sur le droit chemin
- M'expliquer pourquoi la commande cat | grep etc. fait qu'à l'exécution de mon script... eh bien le script ne se termine pas. (ou alors ai-je oublié un truc pour signifier que le script est fini?) j'ai l'impression qu'il attend que je tape quelque chose, et le script ne s'arrête que lorsque je tape exit.
- M'expliquer brièvement (ou me donner un super lien !) pour que je comprenne ce que set prend en paramètre. J'avais essayé un (audacieux) set array $(cat | grep etc) pour ensuite essayer d'utiliser ${array[0]) et compagnie mais selon quel critère fait-il le split? Je me doute qu'il ne va pas deviner tout seul que, moi, ce que je veux, c'est le truc derrière le \t !

Bref, en remerciant sincèrement par avance ceux qui pourront me répondre.
Et ceux qui ont pris le temps de me lire.

Lyra. wink

Dernière modification par Lyralia (Le 21/09/2010, à 11:14)

Hors ligne

#2 Le 17/09/2010, à 18:47

Tuc DEUXLUS

Re : [Résolu] Rechercher paramètre dans un fichier texte

Abonnement: J'ai jamais réussi à trouver un chemin d'accès pour un programme. vu que je les appels par leur "prénoms" c'est un vrai handicape. smile

Hors ligne

#3 Le 17/09/2010, à 20:39

Totor

Re : [Résolu] Rechercher paramètre dans un fichier texte

Bonsoir,

Il existe des tas de solutions mais je vais opter pour celle qui est "full bash":

path=
while IFS=$'\t' read key value
do
  [ "${key}" = "nwpath:" ] && path="${value}"
done < config.ini

Certe, il est possible d'utiliser awk, sed, grep ou encore, cut... mais je pense que tu apprendras plus avec ce que je t'ai fourni.
Je n'ai pas trop le temps d'expliquer et je serai absent ce WE.

Sputnik, nesthib ou d'autres apporteront leur(s) contribution(s)


-- Lucid Lynx --

Hors ligne

#4 Le 17/09/2010, à 20:40

Totor

Re : [Résolu] Rechercher paramètre dans un fichier texte

Tuc DEUXLUS a écrit :

Abonnement: J'ai jamais réussi à trouver un chemin d'accès pour un programme. vu que je les appels par leur "prénoms" c'est un vrai handicape. smile

Je pense que tu n'as pas compris le besoin.
Dans ce cas présent, il s'agit d'extraire une donnée d'un fichier et non trouver l'emplacement d'un fichier.


-- Lucid Lynx --

Hors ligne

#5 Le 18/09/2010, à 00:03

ehmicky

Re : [Résolu] Rechercher paramètre dans un fichier texte

Totor a la meilleure solution je pense car full-bash et compatible sh, cependant, je rajoute d'autres options que tu as si tu veux explorer le sujet. La plupart des gens utiliseront dans ce cas awk, sed ou grep, combinés ensemble ou non. Exemple :

awk '/nwpath:/ { print $2 }' TONFICHIER.TXT

Ou :

sed -n '/nwpath:/ p' TONFICHIER.TXT | cut -f2

Ou :

grep "nwpath:" TONFICHIER.TXT | cut -f2

Tu utilises cat | grep, ce qui est inutile car grep n'a pas besoin d'être pipé, il peut tout simplement prendre le fichier comme argument ^^ Beaucoup de gens utilisent "echo qqchose | COMMANDES" ou "cat FICHIER | COMMANDES" là où un "COMMANDES FICHIER.TXT" ou "COMMANDES <<<INPUT" suffit. Par ailleurs, si tu as eu des problèmes avec cat, c'est sûrement à cause de la commande qui a suivie, pas de cat, car cat analyse le fichier octet par octet et le restitue tel quel, il n'est pas sensé poser de problèmes, même dans des cas particuliers du genre encodage ou présence de caractères null. En l'occurence le problème d'une commande telle que :

cat | grep PATTERN FICHIER

C'est que tu fais ici un cat sur rien. La première partie, avant le pipe est désolidarisée de la deuxième (qui tourne dans un autre subshell en fait), du coup le cat ne voit pas FICHIER, il n'a aucun argument, c'est comme si tu tapais juste cat. Du coup par défaut ça va lire sur l'entrée standard, et non sur FICHIER. Ensuite, grep ne lit sur l'entrée standard (= sur la pipe ici) que si tu lui donnes pas de fichier en argument. Ici, il y en a un, donc non seulement la pipe fournie après cat ne va pas, mais de toute façon grep n'y prête même pas attention. Il faut revoir la question des redirections d'input, les pipes et la syntaxe sur "comment donner un argument à une commande" (pas si simple parfois !) pour mieux voir tout ça.

Edit : Si tu veux mettre les lignes de l'output d'une commande telle que grep dans une array, tu peux faire par exemple :

array=( )
while read ligne_ok ; do
    array[${#array[@]}]="$ligne_ok"
done < <(grep "PATTERN" FICHIER.TXT)

set array $(cat | grep PATTERN) ne marche pas pour plusieurs raisons. D'abord quel est donc cet "array" ? S'agit-il d'une variable déclarée auparavant ?... je ne comprends pas trop. La syntaxe est : set LISTE. LISTE est une suite de mots séparés par whitespace, qui peut être le produit d'un $(COMMANDES). Cependant, ici $(cat | grep PATTERN) est défectueux. Par ailleurs, LISTE sépare ses mots en fonction de whitespace et non de newline, tu aurais donc eu un argument positionnel par mot et non par ligne matchée par grep, en utilisant set de cette façon. Par ailleurs, pour déclarer un array, ce n'est ici pas la syntaxe correcte.

Enfin, je voulais poser une question à Totor :
  - pourquoi utilises-tu ${key} et non $key ? Je pensais que l'utilisation de ${ } ne servait qu'à lever l'ambiguité si par exemple des lettres suivent "message="${VAR}lettres_concaténées_a_VAR", où par exemple pour les arrays ${ARRAY[@]} (même raison en fait). J'ai vu plusieurs personnes utiliser cette syntaxe dans des endroits ne semblant pas le justifier et je me demandais s'il y avait en fait une autre raison pour l'utilisation de cette syntaxe. Merci !

Edit2 : ah oui, et si tu veux savoir comment séparer les différents fields d'une ligne contenue dans un fichier par exemple, va voir du côté de cut, sed et awk. Tu peux aussi utiliser les arrays à cet effet, c'est full-bash, plus efficient et c'est du meilleur code de manière général, mais c'est une approche plus poussée.

Dernière modification par ehmicky (Le 18/09/2010, à 03:49)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#6 Le 18/09/2010, à 12:27

FRUiT

Re : [Résolu] Rechercher paramètre dans un fichier texte

Je crois que la notation ${VAR} protège également le contenu de la variable. Ca n'a pas à voir qu'avec la concaténation.


Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean

Hors ligne

#7 Le 18/09/2010, à 16:38

ehmicky

Re : [Résolu] Rechercher paramètre dans un fichier texte

Mais concrètement, qu'est-ce qui est protégé ?
Je viens de voir la notation ${VAR} encore dans des fichiers conf d'Ubuntu, dans un contexte n'expliquant pas la notation par une concaténation ou l'usage d'un array. Je me demande vraiment à quoi cela sert sinon.
Cela conserve-t-il les '\0' ? A moins que ce soit une question de portabilité ?

Dernière modification par ehmicky (Le 18/09/2010, à 16:39)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#8 Le 21/09/2010, à 10:02

Lyralia

Re : [Résolu] Rechercher paramètre dans un fichier texte

Désolée pour le retard dans ma réponse...

Et merci beaucoup pour les votres !

Je vais jeter un oeil à tout cela. Et fureter un peu sur le net si besoin. Je vous tiens au courant si j'ai des petits soucis avec la mise en application.

En vous remerciant, sincèrement, une nouvelle fois. wink

Lyra.

Hors ligne

#9 Le 21/09/2010, à 10:15

Watael

Re : [Résolu] Rechercher paramètre dans un fichier texte

Je viens de voir la notation ${VAR} encore dans des fichiers conf d'Ubuntu, dans un contexte n'expliquant pas la notation par une concaténation ou l'usage d'un array. Je me demande vraiment à quoi cela sert sinon.

*c'est tout !
ça sert à distinguer la variable de ce qui lui est accolé*
smile*


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#10 Le 21/09/2010, à 11:13

Lyralia

Re : [Résolu] Rechercher paramètre dans un fichier texte

Je viens de tester chacune des solutions proposées, et tout marche nikel tongue
(finalement, je suis restée sur la toute dernière, avec le grep)

Un grand merci pour votre aide, ainsi que pour ce topo fort instructif !
C'est toujours beaucoup plus simple à comprendre, quand c'est expliqué par ceux qui savent wink

Lyra.

Hors ligne

#11 Le 21/09/2010, à 11:44

Totor

Re : [Résolu] Rechercher paramètre dans un fichier texte

ehmicky a écrit :

[...]

array=( )
while read ligne_ok ; do
    array[${#array[@]}]="$ligne_ok"
done < <(grep "PATTERN" FICHIER.TXT)

[...]

Tu t'embêtes bien pour alimenter ton tableau :

unset array
while read ; do
    array+=( "$REPLY" )
done < <(grep "PATTERN" FICHIER.TXT)

Dernière modification par Totor (Le 21/09/2010, à 11:50)


-- Lucid Lynx --

Hors ligne

#12 Le 21/09/2010, à 15:16

ehmicky

Re : [Résolu] Rechercher paramètre dans un fichier texte

Merci de l'astuce !


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#13 Le 21/09/2010, à 15:46

Tuc DEUXLUS

Re : [Résolu] Rechercher paramètre dans un fichier texte

Totor a écrit :
Tuc DEUXLUS a écrit :

Abonnement: J'ai jamais réussi à trouver un chemin d'accès pour un programme. vu que je les appels par leur "prénoms" c'est un vrai handicape. smile

Je pense que tu n'as pas compris le besoin.
Dans ce cas présent, il s'agit d'extraire une donnée d'un fichier et non trouver l'emplacement d'un fichier.

A oui effectivement j'avais pas compris. Pas grave je suis abonné quand même ça me servira un jour. smile

Hors ligne

#14 Le 21/09/2010, à 15:50

ehmicky

Re : [Résolu] Rechercher paramètre dans un fichier texte

Watael a écrit :

*c'est tout !
ça sert à distinguer la variable de ce qui lui est accolé*
smile*

Je me demande si ça doit pas malgré tout servir à autre chose, sinon la notation "${VAR}" serait injustifiée (juste une complication de "$VAR"). Or on la trouve même dans des fichiers conf Ubuntu.


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#15 Le 21/09/2010, à 17:55

fabux

Re : [Résolu] Rechercher paramètre dans un fichier texte

Salut,
[hs]

@ehmicky: selon le guide abs $VAR serait bien la forme simplifiée de ${VAR} (confirmé ).
Il existe également une autre utilité aux accolades.

Je ne saurais te démontrer l'intérêt/avantage, je suis une buse en script, mais comme ça coute rien je les ajoute pour utiliser mes variables...jusqu'à ce que Totor -ou autre balèse qui passerait par là- me démontre que je me prend la tête pour rien wink

@Totor: au passage, si je ne l'ai déjà fais: Merci smile
Tu donne toujours de bons exemples simples pour expliquer une fonction ou l'usage de tel ou tel caractère, ce qui m'a permis d'en comprendre un peu plus. (il me semble d'ailleurs que tu as déjà fait une réponse sur l'usage des variables, mais je ne sais plus si c'était pour les accolades ou autres caractères du style crochets/guillemets ).

[/hs]

Hors ligne