afficher au term une trentaine de lignes et mettre la dernière dans une variab le

Le
Une Bévue
je me connecte par ssh pour faire tourner un script qui sort une 30taine
de lignes.
je détecte par grep la dernière (la précédente contient "iMac's URL :")
pour la mettre dans une variable "URL" que j'envoie en local sur un
butineur.

pour l'instant, je fais ça :
#!/usr/bin/zsh
URL=(`/usr/bin/xclip -o`)
SRV=yt@iMac
RMT_HOME="/Users/yt"
RMT_RECETTE="${RMT_HOME}/bin/recette"

URL=(`/usr/bin/ssh ${SRV} "echo '${URL}' | pbcopy; ${RMT_RECETTE}" |
grep -A 1 "iMac's URL :" | tail -n 1 `)
/usr/bin/xdg-open ${URL}
exit 0

mais là, je ne vois plus du tout la 30taine de lignes, elles sont
mangées par | grep -A

je sais qu'ils existent des pipes nommés, mais ne sais pas les utiliser.

des exemples ?

mon but, donc est de sortir au term la trentaine de lignes tout en
plaçant la dernère dans une variable.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Une Bévue
Le #24199471
Le 26/01/2012 22:51, Une Bévue a écrit :


mon but, donc est de sortir au term la trentaine de lignes tout en
plaçant la dernère dans une variable.



j'ai une première solution, qui ne me convient pas :
STDOUT=`/usr/bin/ssh ${SRV} "${RMT_RECETTE_TEE}"`
echo "STDOUT :n${STDOUT}"
URL=(`echo ${STDOUT} | grep -A 1 "iMac's URL :" | tail -n 1 `)
echo "URL = ${URL}"

car la sortie de STDOUT vient d'un seul coup (j'ai mis des sleep 0.5
dans le script distant)

ce qu'il me faudrait, c'est lire au fur et à mesure la sortie de :
/usr/bin/ssh ${SRV} "${RMT_RECETTE_TEE}"

envoyer ça vers deux commandes simultanément, ie. echo et grep

donc sur deux fifos.
pehache
Le #24199461
Le 26/01/12 22:51, Une Bévue a écrit :
je me connecte par ssh pour faire tourner un script qui sort une 30taine
de lignes.
je détecte par grep la dernière (la précédente contient "iMac's URL :")
pour la mettre dans une variable "URL" que j'envoie en local sur un
butineur.

pour l'instant, je fais ça :
#!/usr/bin/zsh
URL=(`/usr/bin/xclip -o`)
SRV=
RMT_HOME="/Users/yt"
RMT_RECETTE="${RMT_HOME}/bin/recette"

URL=(`/usr/bin/ssh ${SRV} "echo '${URL}' | pbcopy; ${RMT_RECETTE}" |
grep -A 1 "iMac's URL :" | tail -n 1 `)
/usr/bin/xdg-open ${URL}
exit 0

mais là, je ne vois plus du tout la 30taine de lignes, elles sont
mangées par | grep -A

je sais qu'ils existent des pipes nommés, mais ne sais pas les utiliser.

des exemples ?

mon but, donc est de sortir au term la trentaine de lignes tout en
plaçant la dernère dans une variable.



En plaçant un "tee" avant le "grep", et en lui faisant écrire dans le
terminal courant ?

TTY=`tty`

URL=(`/usr/bin/ssh ${SRV} "echo '${URL}' | pbcopy; ${RMT_RECETTE}" | tee
$TTY | grep -A 1 "iMac's URL :" | tail -n 1 `)
Une Bévue
Le #24199681
Le 26/01/2012 23:39, pehache a écrit :
En plaçant un "tee" avant le "grep", et en lui faisant écrire dans le
terminal courant ?

TTY=`tty`

URL=(`/usr/bin/ssh ${SRV} "echo '${URL}' | pbcopy; ${RMT_RECETTE}" | tee
$TTY | grep -A 1 "iMac's URL :" | tail -n 1 `)



ouais, super, merci bien.

j'ai essayé avec un pipe nommé, ça ne marche pas tjs, il ne reçoit
(lecture) pas toutes les lignes tout le temps...
Alain Montfranc
Le #24201101
Après mûre réflexion, Une Bévue a écrit :
je me connecte par ssh pour faire tourner un script qui sort une 30taine de
lignes.
je détecte par grep la dernière (la précédente contient "iMac's URL :") pour
la mettre dans une variable "URL" que j'envoie en local sur un butineur.

pour l'instant, je fais ça :
#!/usr/bin/zsh
URL=(`/usr/bin/xclip -o`)
SRV=
RMT_HOME="/Users/yt"
RMT_RECETTE="${RMT_HOME}/bin/recette"

URL=(`/usr/bin/ssh ${SRV} "echo '${URL}' | pbcopy; ${RMT_RECETTE}" | grep -A
1 "iMac's URL :" | tail -n 1 `)
/usr/bin/xdg-open ${URL}
exit 0

mais là, je ne vois plus du tout la 30taine de lignes, elles sont mangées par |
grep -A

je sais qu'ils existent des pipes nommés, mais ne sais pas les utiliser.

des exemples ?

mon but, donc est de sortir au term la trentaine de lignes tout en plaçant la
dernère dans une variable.



Pourquoi pas :

script -c "/usr/bin/ssh .../..." /tmp/out$$
URL=`cat /tmp/out$$ | grep -A 1 "iMac's URL :" | tail -n 1
rm /tmp/out$$
Arnaud Gomes-do-Vale
Le #24201501
[ Attention, ce message contient du zsh pas testé. ]

Une Bévue
je me connecte par ssh pour faire tourner un script qui sort une
30taine de lignes.
je détecte par grep la dernière (la précédente contient "iMac's URL
:") pour la mettre dans une variable "URL" que j'envoie en local sur
un butineur.



C'est vraiment forcément la dernière ? Si c'est le cas :

ssh tacommande | while read l
do
# C'est bourrin mais ça donne le bon résultat au final.
URL="$l"
echo "$l"
done
tonbutineur "$URL"


Si ce n'est pas forcément la dernière :

nextline=0
ssh tacommande | while read l
do
# C'est moins bourrin mais c'est plus lent.
[[ $nextline -eq 1 ]] && { nextline=0 ; URL="$l" }
echo "$l" | fgrep -q 'iMac.s URL' && nextline=1
echo "$l"
done
tonbutineur "$URL"

--
Arnaud
http://blogs.glou.org/arnaud/
Une Bévue
Le #24201551
Le 27/01/2012 21:39, Arnaud Gomes-do-Vale a écrit :
C'est vraiment forcément la dernière ?



oui, oui, c'est moi qui ai écrit le script distant...

Si c'est le cas :

ssh tacommande | while read l
do
# C'est bourrin mais ça donne le bon résultat au final.
URL="$l"
echo "$l"
done
tonbutineur "$URL"



joli !

merci !
Une Bévue
Le #24201541
Le 27/01/2012 17:49, Alain Montfranc a écrit :

Pourquoi pas :

script -c "/usr/bin/ssh .../..." /tmp/out$$
URL=`cat /tmp/out$$ | grep -A 1 "iMac's URL :" | tail -n 1
rm /tmp/out$$



ouais mais j'ai voulu éviter d'écrire dans un fichier tmp.
Une Bévue
Le #24204131
Le 26/01/2012 23:39, pehache a écrit :

En plaçant un "tee" avant le "grep", et en lui faisant écrire dans le
terminal courant ?

TTY=`tty`

URL=(`/usr/bin/ssh ${SRV} "echo '${URL}' | pbcopy; ${RMT_RECETTE}" | tee
$TTY | grep -A 1 "iMac's URL :" | tail -n 1 `)



comme je l'ai déjà dit, ça marche super bien, excepté un bémol --
cosmétique -- : les lignes arrivent dans le désordre sur TTY :

~ % recettes
Liens-Externes/index.html modified !
Accompagnement/index.html modified !
Amuse-gueule/index.html modified !
Aperitif/index.html modified !

<snip />

Vins/index.html modified !
/Users/yt/Sites/Recettes/index.html modified !


iMac's URL :
http://[2a01:< snip >:2559]/Recettes/index.html
/Users/yt/Sites/sitemap.xml modified !

<snip />

/Users/yt/Sites/Recettes/statistiques.html modified !


donc là, au term, la ligne "http://[2a01:< snip
:2559]/Recettes/index.html" arrive bien avant sa place réelle, c'est


la dernière ligne, dans mon script ruby distant...


bizarre.
Cyrille Lefevre
Le #24211051
Le 27/01/2012 21:39, Arnaud Gomes-do-Vale a écrit :
[ Attention, ce message contient du zsh pas testé. ]

Une Bévue
je me connecte par ssh pour faire tourner un script qui sort une
30taine de lignes.
je détecte par grep la dernière (la précédente con tient "iMac's URL
:") pour la mettre dans une variable "URL" que j'envoie en local sur
un butineur.



C'est vraiment forcément la dernière ? Si c'est le cas :

ssh tacommande | while read l
do
# C'est bourrin mais ça donne le bon résultat au final.
URL="$l"
echo "$l"
done
tonbutineur "$URL"


Si ce n'est pas forcément la dernière :

nextline=0
ssh tacommande | while read l
do
# C'est moins bourrin mais c'est plus lent.
[[ $nextline -eq 1 ]]&& { nextline=0 ; URL="$l" }
echo "$l" | fgrep -q 'iMac.s URL'&& nextline=1
echo "$l"
done
tonbutineur "$URL"




Bonjour,

attention à la construction ci-dessus qui ne fonctionne pas sur tous les
shells (ok en ks, ko sous bash par ex., à moins qu'ils n'aient virà ©s
leur cuti !) dans le sens ou la partie droite est lancé dans un
sous-shell, auquel cas, $URL n'est pas renseigné à la sortie du done.

alternative :

URL=
while read l; do
URL=$l
...
done << EOF
$(ssh ...)
EOF
echo $URL
=> ok

sous bash, => vide

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
remove "%nospam" and ".invalid" to answer me.
unbewusst.sein
Le #24213631
Cyrille Lefevre
attention à la construction ci-dessus qui ne fonctionne pas sur tous les
shells (ok en ks, ko sous bash par ex., à moins qu'ils n'aient virés
leur cuti !) dans le sens ou la partie droite est lancé dans un
sous-shell, auquel cas, $URL n'est pas renseigné à la sortie du done.



j'utilise zsh


alternative :

URL > while read l; do
URL=$l
...
done << EOF
$(ssh ...)
EOF
echo $URL
=> ok

sous bash, => vide



ok, merci bien.`

--
« Le vrai problème avec les menteurs est que l'on ne peut jamais
être certain qu'ils ne vont pas dire la vérité. »
(Kingsley Amis)
Publicité
Poster une réponse
Anonyme