BOUCLE WHILE READ LINE

Postez ici vos scripts Bash, Python, etc.
PHIL888
Messages : 15
Enregistré le : mar. 12 mai 2020 09:45

BOUCLE WHILE READ LINE

Message par PHIL888 »

Bonjour à tous,

ma question va probablement vous paraître facile, mais je tombe sur un cas que je n'ai pas encore rencontré :
Dans mon script, je dois lire le même fichier deux fois...la première fois tout se passe bien, et bash ignore la deuxième. Il y a surement une remise à zéro qui m'échappe...
voici la partie de script qui pose problème : ( j'ai omis volontairement toute la partie de traitement...sed et autre...pour que ce soit plus lisible )

Code : Tout sélectionner

while read ligne
do 
echo $ligne
done < line.txt

read -p "stop" stop1

while read ligne
do 
echo "$ligne" 
done < line.txt

merci pour votre avis
System:
Host: philippe-Aspire-8735 Kernel: 5.4.0-80-generic x86_64 bits: 64
Desktop: Cinnamon 4.8.6 Distro: Linux Mint 20.1 Ulyssa
Machine:
Type: Laptop System: Acer product: Aspire 8735 v: 0100

Processes: 193 Uptime: 21m Memory: 3.84 GiB used: 2.32 GiB (60.3%)
Shell: bash inxi: 3.0.38

Avatar du membre
cyrille
Administrateur du site
Messages : 12292
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: BOUCLE WHILE READ LINE

Message par cyrille »

Chez moi ça marche, juste faire ENTREE après le stop
Sinon la procédure de lire 2 fois le même fichier pour appliquer des actions est curieuse, autant tout faire à la première lecture sauf si attentes particuliere

Commente

Code : Tout sélectionner

read -p "stop" stop1
en

Code : Tout sélectionner

#read -p "stop" stop1

D'ailleurs je ne comprends pas ce que tu attends de cette ligne ????

tu verras que c'est lu 2 fois

PS la solution la meilleure pour la lecture est d'utiliser l'IFS

je te file un exemple

Code : Tout sélectionner

#!/bin/bash
input="/path/to/txt/file"
while IFS= read -r line
do
  echo "$line"
done < "$input"
Désolé en très grande vitesse

(edit : complément d'info : https://lipn.univ-paris13.fr/~cerin/SE/ ... hell2.html )
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

PHIL888
Messages : 15
Enregistré le : mar. 12 mai 2020 09:45

Re: BOUCLE WHILE READ LINE

Message par PHIL888 »

Merci pour la réponse.

J'ai essayé avec IFS...ça donne le même résultat.
Il s'arrête après la première lecture...
Après avoir fait entrée,
il ne fait pas la deuxième boucle while read line...
message :
[2]+ Arrêté ./essread.sh


L'intérêt de lire deux fois le fichier, c'est :
la première lecture recherche une occurence dans un fichier A.txt, quand il la trouve, il enregistre le numéro de ligne dans line.txt

A la deuxième lecture, il "devrait" repartir à la ligne du fichier A.txt et afficher le contenu sur l écran et dans un fichier ( avec tee ) , puis passer à la référence suivante...sans lire à nouveau tout le fichier A.TXT. Cela permet de garder une trace des recherches et d'archiver quelques lignes au lieu de relire à chaque fois des milliers de lignes..

La question, c'est après la première boucle WHILE READ LINE, y a t'il possibilité de remettre à zéro, comme s'il entrait dans le programme ( j'ai aussi essayé en changeant le nom du fichier...

merci pour votre aide



J
System:
Host: philippe-Aspire-8735 Kernel: 5.4.0-80-generic x86_64 bits: 64
Desktop: Cinnamon 4.8.6 Distro: Linux Mint 20.1 Ulyssa
Machine:
Type: Laptop System: Acer product: Aspire 8735 v: 0100

Processes: 193 Uptime: 21m Memory: 3.84 GiB used: 2.32 GiB (60.3%)
Shell: bash inxi: 3.0.38

Avatar du membre
cyrille
Administrateur du site
Messages : 12292
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: BOUCLE WHILE READ LINE

Message par cyrille »

tu peux donner l'ensemble du script et un fichier à inserer en exemple

je serai plus dispo après 16h30
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
cyrille
Administrateur du site
Messages : 12292
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: BOUCLE WHILE READ LINE

Message par cyrille »

tu dois avoir un truc qui le perturbe dans ton script

un fichier de test

Code : Tout sélectionner

serveur@serveurProliant:~$ cat line.txt
un
deux
trois
le script

Code : Tout sélectionner

serveur@serveurProliant:~$ cat test.sh
while read ligne
do
echo $ligne
done < line.txt

#read -p "stop" stop1

while read ligne
do
echo "$ligne"
done < line.txt
lancement du script

Code : Tout sélectionner

serveur@serveurProliant:~$ bash test.sh
un
deux
trois

un
deux
trois
Comme tu vois il lit bien les 2, l'erreur doit venir d'ailleurs ;)
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
cyrille
Administrateur du site
Messages : 12292
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: BOUCLE WHILE READ LINE

Message par cyrille »

déjà plutot que de mettre 2 fois la même entrée fait une fonction, ça évitera les fautes de syntaxe et facilitera la lecture

Code : Tout sélectionner

#!/bin/bash

function read_file {
while read ligne
do
echo $ligne
done < line.txt
}

echo "Premiere lecture"
read_file

sleep 1

echo "Seconde lecture"
read_file
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
cyrille
Administrateur du site
Messages : 12292
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: BOUCLE WHILE READ LINE

Message par cyrille »

La question, c'est après la première boucle WHILE READ LINE, y a t'il possibilité de remettre à zéro, comme s'il entrait dans le programme ( j'ai aussi essayé en changeant le nom du fichier...
j'avoue ne pas avoir compris
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
cyrille
Administrateur du site
Messages : 12292
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: BOUCLE WHILE READ LINE

Message par cyrille »

Dispo.
j'ai relu avec attention ce que tu voulais faire
L'intérêt de lire deux fois le fichier, c'est :
la première lecture recherche une occurence dans un fichier A.txt, quand il la trouve, il enregistre le numéro de ligne dans line.txt

A la deuxième lecture, il "devrait" repartir à la ligne du fichier A.txt et afficher le contenu sur l écran et dans un fichier ( avec tee ) , puis passer à la référence suivante...sans lire à nouveau tout le fichier A.TXT. Cela permet de garder une trace des recherches et d'archiver quelques lignes au lieu de relire à chaque fois des milliers de lignes..
Donc tu lis un fichier et cherche une occurence. Si occurence est trouvée, tu affiches la ligne à l'écran et tu la copies dans un fichier séparé (une sorte de log)

Si oui, cette commande ne suffit elle pas ?

Code : Tout sélectionner

 sed -n '/motif/p' line.txt 2>&1 | tee sortie.txt



Si tu fais un test avec line.txt et un contenu pris au pif sur le web

Code : Tout sélectionner

 cat line.txt 
La girafe est un mammifère vivant en Afrique, dans la savane. 
Le mot girafe vient de l'arabe زرافة , zarāfah signifiant 
« charmante ». C’est l’animal le plus grand en hauteur. 
Ses caractéristiques physiques 
- Elle peut mesurer jusque 5 mètres de haut. 
- Elle a un long cou, une petite tête fine et 
deux cornes. 
- La girafe a une langue très longue avec 
laquelle elle attrape les feuilles situées au 
sommet des arbres. Elle est herbivore. 
- Elle peut courir vite et est capable 
d’atteindre 50km/h. 
Le petit s’appelle 
le girafon. 
• Les girafes ne font que très rarement 
des sons; elles communiquent plus 
avec des mouvements du cou et de la 
tête. 
• La girafe est le seul vertébré terrestre 
qui ne baille pas! 
• Autre curiosité: c’est le seul 
mammifère qui peut atteindre ses 
On choisit le motif "girafe"

Code : Tout sélectionner

administrateur@primtux:~$ sed -n '/girafe/p' line.txt 2>&1 | tee sortie.txt
La girafe est un mammifère vivant en Afrique, dans la savane. 
Le mot girafe vient de l'arabe زرافة , zarāfah signifiant 
- La girafe a une langue très longue avec 
• Les girafes ne font que très rarement 
• La girafe est le seul vertébré terrestre 

Code : Tout sélectionner

administrateur@primtux:~$ cat sortie.txt 
La girafe est un mammifère vivant en Afrique, dans la savane. 
Le mot girafe vient de l'arabe زرافة , zarāfah signifiant 
- La girafe a une langue très longue avec 
• Les girafes ne font que très rarement 
• La girafe est le seul vertébré terrestre 
Il y a donc bien affichage à l'écran des lignes contenant l'occurence et sauvegarde dans un fichier avec concanténation
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

PHIL888
Messages : 15
Enregistré le : mar. 12 mai 2020 09:45

Re: BOUCLE WHILE READ LINE

Message par PHIL888 »

Merci à Cyrille et à tous pour votre aide.

J'ai laissé "refroidir" le problème, et j'ai trouvé la solution...

Cela venait évidemment de moi.

Mon script était lancé par un autre script, ( oui, oui, c'est un peu -usine à gaz - ), dans lequel j'ai fait l'erreur suivante :

./monscript.sh &

Dûe à l'habitude de lancer l'éditeur avec : gedit monscript.sh & , pour avoir la main sur le terminal....

Du coup,, il sortait du script ou ignorait les interruptions....( read -p) . A priori, cela a aussi une incidence sur cette fameuse boucle while read line....

Si je lance "normalement" avec ./monscript.sh, tout se passe à nouveau normalement....

Mes excuses pour ce casse-tête....

Merci encore.

Citation à méditer : Le périphérique le plus souvent en cause lors d'une erreur, est celui qui se situe entre l'écran et le dossier de la chaise....
System:
Host: philippe-Aspire-8735 Kernel: 5.4.0-80-generic x86_64 bits: 64
Desktop: Cinnamon 4.8.6 Distro: Linux Mint 20.1 Ulyssa
Machine:
Type: Laptop System: Acer product: Aspire 8735 v: 0100

Processes: 193 Uptime: 21m Memory: 3.84 GiB used: 2.32 GiB (60.3%)
Shell: bash inxi: 3.0.38

Avatar du membre
cyrille
Administrateur du site
Messages : 12292
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: BOUCLE WHILE READ LINE

Message par cyrille »

Citation à méditer : Le périphérique le plus souvent en cause lors d'une erreur, est celui qui se situe entre l'écran et le dossier de la chaise....
https://fr.wiktionary.org/wiki/PEBCAK
;)
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Répondre