Vous n'êtes pas identifié(e).
Au lancement du script, la ligne2 affiche juste "#", pour éviter qu'il affiche des champs vides, il suggère dans les commentaires de la fin du script d'utiliser "awk". J'ai essayé de différentes manières, mais je n'y suis pas arrivé : quelqu'un peut m'aider ?
Dernière modification par Guizmo (02-03-2015 19:04:11)
Je suis débutant, si à la lecture d'un de mes postes vous avez des suggestions, des liens à me donner ou n'importe quoi qui puisse me faire avancer, n'hésitez pas ! !
Merci
Hors ligne
Remarque, la seconde ligne d'un fstab est juste un # (dans debian en tous cas).
Et je ne comprends pas vraiment la question ; utiliser awk pour quoi faire ?
Explique ce que tu veux dire « éviter d'afficher des champs vides ». Qu'est-ce qu'un champ, dans
ce contexte ? Un ligne ?
Hors ligne
pour les afficher tous les six.
Tu devrait pouvoir afficher les champs que tu veux, en adaptant un peu
Pour ce qui est d'utiliser la commande set de bash, pour faire la même chose, je
ne vois pas. help set devrait mettre sur la voie.
Dernière modification par enicar (02-03-2015 22:16:58)
Hors ligne
Il y a 6 champs : <file system> <mount point> <type> <options> <dump> <pass>
Est ce que ça répond à mon champs "#" vide de 2ème ligne ?
Si oui adapte ta réponse stp, pck je ne comprends rien !
Dernière modification par Guizmo (02-03-2015 22:59:05)
Je suis débutant, si à la lecture d'un de mes postes vous avez des suggestions, des liens à me donner ou n'importe quoi qui puisse me faire avancer, n'hésitez pas ! !
Merci
Hors ligne
Il y'a 6 champs dans quoi ?!
Dans le fichier : /etc/fstab.
Voir : https://debian-facile.org/doc:systeme:fstab
saque eud dun (patois chtimi : fonce dedans)
Hors ligne
Hors ligne
Affiche que les lignes non commentées, j'aurais besoin qu'on me détaille, si possible, le début de la ligne :"$0 !~ /^#/"
"$0" a quelle valeur ?
"!~" De mes humbles connaissances, le "!" inverse une demande... Qu'est ce que le tilde fait là !?
^# = les lignes qui commencent par "#"
Bon pour l'avoir testée l'ensemble veut dire d'afficher les 6 champs de toute les lignes qui ne commencent pas par "#", de là à l'adapter...
J'ai essayé qqu bidouilles genre /^#:/ avec ou sans " ; /^#" "/ Ça ne donne rien...
Je suis débutant, si à la lecture d'un de mes postes vous avez des suggestions, des liens à me donner ou n'importe quoi qui puisse me faire avancer, n'hésitez pas ! !
Merci
Hors ligne
D'abord, il faut savoir que awk travaille par ligne. Je veux dire, qu'il va lire ligne
par ligne sur l'entrée standard et exécuté la/les commande/s pour chaque ligne. On peut changer ce
comportement (avec la variable RS (Record Separator = séparateur d'enregistrement) qui vaut par défaut "\n" (caractère de nouvelle ligne)). C'est une façon de voir un fichier texte (ou non) comme une suite d'enregistrement
que l'on lit séquentiellement.
$0 représente la ligne complète (en fait un enregistrement) en cours de lecture.
!~ est bien la négation de ~. ~ demande à awk de chercher une correspondance de motif.
Ici le motif que j'ai employé est une expression rationnelle (abusivement appelé régulière)
qui veut dire toutes les lignes qui commencent par un # (le ^ veut dire le début de la ligne,
# n'a pas de signification particulière dans ce contexte).
Donc comme tu l'as deviné, ça permet d'examiner les lignes qui ne commencent pas par un #.
Ensuite entre les { }, je demande d'afficher les « champs » de 1 à 6. Les champs d'un enregistrement
sont séparés par des caractères blancs (espace, tabulation et nouvelle ligne). Ce comportement peut
aussi être changé en utilisant la variable FS…
L'esprression rationnelle qui dé"signe les lignes qui commencent par un # suivis de rien ou d'espaces est
* signifie zéro ou plusieurs occurrences du caractère qui le précède (ici un espace)
$ signifie la fin de la ligne (c'est un point d'ancrage, comme ^ qui signifie le début de la ligne).
Donc pour afficher les lignes qui t'intéressent, on peut faire comme cela :
Le problème de ce code, est qu'il va afficher des lignes vides, si elles contiennent des tabulations…
Pour éviter cela, on a recourt à une autre expression rationnelle. Il n'y a pas grand chose à changer.
L'expression rationnelle est :
[ \t] représente un caractère qui est soit un espace ou une tabulation.
L'espace se représente lui même et \t veut dire une tabulation.
C'est un peu long d'apprendre à se servir des expressions rationnelles, mais ça vaut le coup car
c'est un moyen puissant d'analyser un texte.
Bon, il y a pleins d'autres choses à apprendre à ce sujet… mais je ne compte pas refaire
la documentation… C'est quand même une belle introduction dans le sujet
Dernière modification par enicar (03-03-2015 11:55:38)
Hors ligne
N'affiche plus les lignes vides !
Me reste plus qu'à réussir à lui faire afficher que les 2 premières lignes pleines, et de tenter de l'intégrer au script de base !
J'ai du boulot !
Je Re pour appeler à l'aide ou pour la correction !
Dernière modification par Guizmo (03-03-2015 13:27:18)
Je suis débutant, si à la lecture d'un de mes postes vous avez des suggestions, des liens à me donner ou n'importe quoi qui puisse me faire avancer, n'hésitez pas ! !
Merci
Hors ligne
Tu ferais mieux d'utiliser :
qui affiche l'enregistrement en cours d'évaluation (c'est à dire la ligne entière dans notre cas).
On peut même simplifier « print » seul est équivalent à « print $0 »…
Hors ligne
Merci M'sieur... Quel talent !
Je t'en prie Et ce n'est pas du talent, ce sont juste quelques connaissances
acquises au fil du temps et des besoins. J'ai besoin de regarder les pages man
très régulièrement, je ne connais pas tout cela par cœur. Surtout quand ce sont
des choses que je n'ai pas utilisées depuis longtemps…
Hors ligne
Dans le script initial !
Au pire c'est pas un drame, c'est juste un exercice...
Je suis débutant, si à la lecture d'un de mes postes vous avez des suggestions, des liens à me donner ou n'importe quoi qui puisse me faire avancer, n'hésitez pas ! !
Merci
Hors ligne
Ensuite, quand il demande :
Maintenant, comment analysez-vous les champs séparés de chaque ligne ?
Je pense qu'il parle des champs des lignes qui ne commencent pas par un #. Rappelle toi, je t'ai
dit que chaque ligne était un enregistrement, et que les champs sont séparés par des espaces ou des tabulations.
Ce n'est pas un hasard, s'il a choisi le fichier fstab qui se prête très bien à cet exercice de découpage
en plusieurs champs.
Dans le message numéro #3 de ce fil, j'avais dit :
Il y a 6 champs : <file system> <mount point> <type> <options> <dump> <pass>
Ces Champs sont dans les lignes qui ne sont pas vides et qui ne commencent pas par un #.
Au fait , les lignes qui commencent par un # sont des commentaires, et donc ces lignes
ne servent pas la fonctionnalité du fichier fstab… (as-tu regardé man fstab ? Tu devrais… )
Remarque bien, que ces 6 champs, dans la syntaxe du fstab, sont bien séparés par des espaces ou des
tabulations. C'est pour cela que awk est particulièrement bien adapté à l'analyse de ce fichier.
Enfin, si tu veux juste intégré :
dans le script original, il faut utiliser un tube, comme cela :
Évidemment, c'est un peu plus complexe… Remarque que l'on ne peut plus séparé l'affectation des
variables $ligne1 et $ligne2 de l'affichage de ces variables. La lecture et l'affichage sont dans le même
bloc d'accolade { … }. Ceci est du au fait que l'on utilise un tube ; bash va créer un nouveau sous shell.
Donc on va avoir deux processus qui communique via le tube (c'est le principe même d'un tube).
Le premier processus, awk ici, va écrire dans le tube, et l'autre processus va lire dans le tube.
Ce second processus est le sous shell qu'à lancer bash et correspond à tout le bloc qui est entre accolade.
Comme, ce sont deux processus différents, cela veut dire que les variables $ligne1 et $ligne2 qui sont
affectées dans le second processus, n'existent pas dans le premier ! Et donc si l'on sort, le code
qui affiche les variables $ligne1 et $ligne2 du bloc { …}, rien ne ve s'afficher, puisque ces variables n'existe pas
dans le premier shell.
En effet, dès que le bloc {…} est fini, le sous shell se termine et les variables $ligne1 et $ligne2 sont perdues.
C'est un bel exemple d'une sorte de variables locales
Enfin tu remarqueras, que la seconde ligne de fstab est bien ignoré.
Bon, je sais, ça fait beaucoup… mais voilà ce que c'est de poser des questions
Dernière modification par enicar (05-03-2015 15:12:58)
Hors ligne
Je n'affiche que les deux premiers champs, en nommant leur fonction. Les
6 champs sont dans les variables champs[0] à champs[5]. On peut utiliser
celui que l'on veut indépendamment.
Quelques explications sont nécessaires.
Tout d'abord, read lit des enregistrements qui, par défaut, sont séparés
par des nouvelles lignes. Dit autrement, par défaut read lit une ligne
entière à la fois.
« read -a champs » : L'option « -a » va demander à read
de découper chaque ligne en plusieurs champs qui correspondent à des
mots (séparés par des espaces). Et la variable « champs » va être
affecté comme un tableau, c'est à dire que nos six champs se
retrouveront dans une case différentes d'un tableau. Pour accéder au
premier élément, on utilise ${champs[0]}, au deuxième : ${champs[1]}, et
ainsi de suite jusqu'au sixième : ${champs[5]}.
Les indices des tableaux commencent à zéro dans bash.
grep -qv '^#\|^$' :
-qv : raccourcis pour dire -q -v.
-q soit silencieux, au lieu d'afficher les lignes qui
correspondent, grep n'affiche rien. En effet, ce qui nous
intéresse ici, c'est juste de savoir si le motif correspond ou
pas. Seule la valeur de retour de grep nous intéresse.
-v inverse la correspondance, c'est à dire que grep
trouve une correspondance quand le motif ne correspond pas !
'^#\|^$' : les '' sont là pour protéger le motif de l'interprétation du
shell.
Ici j'utilise une alternative entre deux motifs.
C'est le \| qui permet de signifier cette alternative.
^# est une ligne qui débute par un #(un commentaire quoi )
^$ est une ligne vide.
Rappel : ^ veut dire début de chaine et $ veut dire fin
de chaine.
Donc le motif en entier désigne les lignes qui débutent par
un # ou les lignes vides
Bon, je pense que pour le while do… done et le if … then … fi, tu te doutes de ce que c'est
Enfin, la syntaxe de bash n'est pas la plus évidente, les langages de scripts comme python
ont une syntaxe bien plus claire
Dernière modification par enicar (08-03-2015 18:01:00)
Hors ligne
Je suis débutant, si à la lecture d'un de mes postes vous avez des suggestions, des liens à me donner ou n'importe quoi qui puisse me faire avancer, n'hésitez pas ! !
Merci
Hors ligne
J'ai tenté en mettant un > à la fin de la ligne awk, sans plus de succès, j'étais pas si loin d'y arriver... J'ai bricolé les " les ' les } les ...'#]!?}{ ! ! !'
... C'est des sadiques les programmeurs !
Je continue...
Je suis débutant, si à la lecture d'un de mes postes vous avez des suggestions, des liens à me donner ou n'importe quoi qui puisse me faire avancer, n'hésitez pas ! !
Merci
Hors ligne
Ici j'utilise une alternative entre deux chaines.
C'est le \| qui permet de signifier cette alternative.
Donc là le \ avt le pipe est là pour que ce soit à nouveau le shell qui interprète le pipe, si j'ai bien compris...
Bien que... là il voudrait dire "oubien" et non "diriger la sortie d'une commande vers l'entrée une autre"...
Bravo pour tes explications !
Dernière modification par Guizmo (05-03-2015 14:42:44)
Je suis débutant, si à la lecture d'un de mes postes vous avez des suggestions, des liens à me donner ou n'importe quoi qui puisse me faire avancer, n'hésitez pas ! !
Merci
Hors ligne
les '' sont là pour protéger le motif de l'interprétation du shell.
Il y a quand même un piège ce sont deux ', et non une ". Ce qui, à la lecture, n'est pas évident :
'' "
Il faut avouer que la différence ne saute pas aux yeux…
J'aurais mieux fait d'écrire : « les deux ' sont là pour protéger le motif de l'interprétation du shell ».
Comme quoi, je peux encore mieux faire
Et donc le signe | dans le motif qui est interprété par grep n'a rien à voir avec un tube.
Seulement pour grep, | signifie simplement |. Par contre \| signifie une alternative entre deux chaines.
Je sais, c'est un peu alambiqué… j'aurais mieux fait d'utiliser egrep, qui a des expressions rationnelles
plus cohérentes… mais bon, vu que je n'utilise jamais egrep…
Dernière modification par enicar (05-03-2015 16:16:31)
Hors ligne
T'y est pas du tout ! Tout ce qui est entre les ' '
Devient :
T'y es pas du tout ! Tout ce qui est entre les simples quotes ' '
saque eud dun (patois chtimi : fonce dedans)
Hors ligne
Hors ligne
a|b : vous pouvez écrire l'option « a » OU « b », mais pas les deux à la fois ;
Je suis débutant, si à la lecture d'un de mes postes vous avez des suggestions, des liens à me donner ou n'importe quoi qui puisse me faire avancer, n'hésitez pas ! !
Merci
Hors ligne
saque eud dun (patois chtimi : fonce dedans)
Hors ligne
Hors ligne
Je suis débutant, si à la lecture d'un de mes postes vous avez des suggestions, des liens à me donner ou n'importe quoi qui puisse me faire avancer, n'hésitez pas ! !
Merci
Hors ligne
captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.
Hors ligne