Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

10 réponses
Avatar
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.

10 réponses

Avatar
Une Bévue
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.
Avatar
pehache
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 `)
Avatar
Une Bévue
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...
Avatar
Alain Montfranc
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$$
Avatar
Arnaud Gomes-do-Vale
[ Attention, ce message contient du zsh pas testé. ]

Une Bévue writes:

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/
Avatar
Une Bévue
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 !
Avatar
Une Bévue
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.
Avatar
Une Bévue
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:&lt" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://[2a01:&lt; 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:&lt" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://[2a01:&lt; snip
:2559]/Recettes/index.html" arrive bien avant sa place réelle, c'est


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


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

Une Bévue writes:

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.
Avatar
unbewusst.sein
Cyrille Lefevre <cyrille.lefevre-news% wrote:

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)