Jump to content

Shell unix: comment afficher le contenu d'un fichier txt dans le corps d'un mail?


Recommended Posts

sed 's/\x1b//g' statutCollab.txt | sed 's/\[1;32m//g' | sed 's/\[0;39m//g' | mail -s "Vérifications du Statut de Collab" toto@pluton.com

Après, il doit y avoir moyen de faire tout ça en une seul commande pour optimiser tout ça. Mais pour un petit fichier, pas besoin de se prendre la tête

Link to post
Share on other sites
Il y a 10 minutes, jakol a écrit :

j'ai fait:

sed 's/\x1b//g' statutCollab.txt && && sed 's/\[1;32m//g' statutCollab.txt | mail -s "Vérifications du Statut de Collab" toto@pluton.com

sed 's/\x1b//g' statutCollab.txt | sed 's/\[1;32m//g' statutCollab.txt | mail -s "Vérifications du Statut de Collab" toto@pluton.com

Attention, dans les deux cas, tes commandes sed s'appliquent à un fichier d'entrée et sortent le résultat dans la console.

Quand tu fais

sed 's/\x1b//g' statutCollab.txt | sed 's/\[1;32m//g' statutCollab.txt

tes deux commandes repartent du fichier d'origine.

Il faut faire::

sed 's/\x1b//g' statutCollab.txt | sed 's/\[1;32m//g' | mail -s "Vérifications du Statut de Collab" toto@pluton.com

et ça devrait marcher: le second sed prend alors directement le résultat du premier.avec 

sed 's/\[1;[0-9]*m//g'

tu devrais supprimer tous les [1;...m

 

Sinon, l'explication de pourquoi ça ne marchait pas au début et que tu avais un message encodé base64:

  1. tu captures le résultat d'une console VT100. ton fichier texte ne contient pas que du texte, mais tu ne le verras pas toujours à l'affichage (on peut construire des fichiers qui ne s'affichent pas par un "cat"
  2. Tu envoies ce résultat dans mil, qui détecte des caractères spéciaux et fait un encodage pour que tout passe (ton fichier semblait être un binaire)

D'où mon insistance pour télécharge le fichier afin de l'analyser.

Link to post
Share on other sites

Il est aussi possible de faire un 

sed -i 's/\x1b//g' statutCollab.txt

L'option "-i" permettant de modifier le fichier par le résultat du sed. Donc c'est plutôt à éviter sur le fichier d'origine pour ne pas le perdre.

Cette option ne fonctionne pas sur le mac

Link to post
Share on other sites

Pour répondre à @brice.wernet, il faut prendre le fichier est remplacé le caractère ^ par 0x1B (caractère escape dans Notepad++)

@jakol a posté son message sur 1 autre forum (developpez.net)

Et la réponse de N_BaH est cat -v fichier | mail -s sujet user@machine

J'ai testé le cat seul, et cela ne semble pas fonctionner :zarb: : cela remplace les caractères escape par des caractères ASCII. Peut-être que mail détecte les séquences de couleur ainsi et les supprime :zarb:

Il y a aussi la commande ansi2txt qui semble faire le travail, mais n'est pas standard (dans le paquet colorized-logs ou kbtin)

Sinon, la majorité des réponses sont à coups de sed et perl (ou alors par exemple, de tput, XTERM="..." pour créer 1 session sans les couleurs)

Edited by foetus
Link to post
Share on other sites
Il y a 43 minutes, foetus a écrit :

J'ai testé le cat seul, et cela ne semble pas fonctionner :zarb: : cela remplace les caractères escape par des caractères ASCII. Peut-être que mail détecte les séquences de couleur ainsi et les supprime :zarb:

C'est une chose particulière que de traiter des fichiers textes de source et systèmes différents. Ce que cat affiche n'est pas la réalité: c'est déjà interprété (longue expérience de traitement des accents et autres caractères "copyright"  "marque déposée" entre des systèmes windows et des systèmes de 1996, et la réinterprétation de flux d'impression matricielle 😅)

Tout ce qu'un ordinateur affiche pour un affichage humain n'est pas forcément juste ou complet: il dépend de la police de caractère d'affichage ou de caractères d'échappement non imprimés ou réinterprétés.

Exemple pour un flux d'impression matricielle:

  • L'imprimante reçoit "mot<backspace><backspace><backspace>mot<backspace><backspace><backspace>____"
  • L'imprimante imprime mot en gras car deux passages, et souligné
  • cat ou type affiche "___" car "mot" est effacé deux fois à l'affichage (à cause des <backspace>)

Moralité: "never trust text files."

Anecdote: 

  • Ca marche aussi pour les exécutables: si on fait un type sur le fichier exécutable du jeu budokan sous DOS, au lieu de la bouillie de caractères informe dont certains nous faisaient passer en mode 40 colonnes, on a un joli message texte tout propre. pour faire ce genre de fichier, il suffit d'y inclure le caractère de fin de texte (EOT) pour la console. On pouvait donc faire des fichiers texte avec deux parties: la partie visible et la partie "cachée" en les séparant par ce caractère EOT. J'imagine qu'on peut le faire sous Unix.
  • C'est pour cela que Windows est plus "juste" avec ses \r\n en fin de ligne, car c'est imprimable (comme sur un machine à écrire: \r pour retourner au début de ligne, \n pour aller à la ligne suivante)
Link to post
Share on other sites

Bonjour,

merci beaucoup pour les infos.

J'ai effectivement posté la demande ailleurs...J'espère que vous ne le prenez pas mal....

Je souhaiterais savoir s'il est possible de récupérer le mot "Démarrée" ou "Arrêtée" dans le fichier statutCollab.txt et intégrer le mot dans le sujet du mail

 mail -s l'application est 'Démarrée'  statutCollab.txt toto@pluton.fr

ou

mail -s l'application est 'Arrêtée'  statutCollab.txt toto@pluton.fr

Merci pour vos retours

Bien cordialement

 

 

 

Link to post
Share on other sites

Avec un

grep Démarrée statutCollab.txt

à faire avant le reste. Et suivant le code retour tu envoies avec un sujet ou l'autre. Sinon, vu qu'il y a plusieurs lignes, difficile d'extraire un mot particulier. A moins d'extraire uniquement la première ligne via la commande "head -1" pour ensuite ne farder que la partie de ton choix (via le sed à nouveau)

Link to post
Share on other sites

Merci

j'ai fait

head -1  statutCollab.txt  > etat.txt | sed 's/*/Démarrée/g' etat.txt

apparement le sed n'est pas bon...

lorsque j'ouvre à nouveau etat.txt, les lignes restent inchangées..

 

 

 

Link to post
Share on other sites
head -1 statutCollab.txt | sed 's/\x1b//g' | sed 's/.*\[1;32m\(.*\)\[0;39m.*/\1/g'

Cela devrait retourner le mot en couleur de la première ligne 😉

Link to post
Share on other sites

merci

j'obtiens le résultat suivant

image.png.26f4a50e03cefe15e9fe43216dcb0d8b.png

est-il possible d'intégrer cette ligne entière dans le sujet du mail?

mail -s "cette ligne" toto@pluton.fr 😏

 

Link to post
Share on other sites

Plus d'explication sur ta commande

il y a une heure, jakol a écrit :

Merci

j'ai fait

head -1  statutCollab.txt  > etat.txt | sed 's/*/Démarrée/g' etat.txt

apparement le sed n'est pas bon...

lorsque j'ouvre à nouveau etat.txt, les lignes restent inchangées..

 

Ton head récupère la première ligne et la stocke dans le fichier etat.txt : ok

head -1  statutCollab.txt  > etat.txt

Le "|" permet de rediriger le résultat de la commande précédente à la suivante. Sauf que là tu n'as aucun résultat vu que tu le stockes dans un fichier. 

 

Le sed ne comprendra rien ici. Tu essayes de remplacer la répétition (*) de "rien" par le mot "Démarrée" dans le fichier etat.txt

On utilise plutôt ".*", le point correspond à n'importe quel caractère et avec l'étoile il prendra donc toute la série de caractères possibles. Donc la ligne complète si rien d'autre de l'arrête. Je te conseille de regarder les expression régulières pour en savoir plus

sed 's/*/Démarrée/g' etat.txt

 

Il y a 7 minutes, jakol a écrit :

merci

j'obtiens le résultat suivant

image.png.26f4a50e03cefe15e9fe43216dcb0d8b.png

est-il possible d'intégrer cette ligne entière dans le sujet du mail?

mail -s "cette ligne" toto@pluton.fr 😏

 

 

Pourtant, cela fonctionne bien :

$ cat statutCollab.txt 
Statut de l'application (Espaces Collaboratifs) sur collab-app1.in.ac-strasbourg.fr ... Démarrée (pid : 2508)
Statut de l'application (Espaces Collaboratifs) sur collab-app2.in.ac-strasbourg.fr ... Démarrée (pid : 1742)
$ head -1 statutCollab.txt | sed 's/\x1b//g' | sed 's/.*\[1;32m\(.*\)\[0;39m.*/\1/g'
Démarrée
$

Le résultat du cat avec le "Démarrée" bien en couleur :

660655252_Capturedcran2021-03-1613_38_16.thumb.png.6a259c423941a1576521d42427bb0af7.png

Tu as sans doute fait une erreur ou un message d'erreur dans ta commande. Merci de la poster

Sinon, oui il est possible d'intégrer la ligne dans le sujet du mail. Mais le caractère de couleur que tu as à nouveau (d'où ma certitude que tu as fait une erreur) va faire planter la commande 😁

 

  • Like 1
Link to post
Share on other sites

1) oui

effectivement :

 head -1  statutCollab.txt  > etat.txt | sed 's/.*/"Démarrée"/g' etat.txt
"Démarrée"

2) oui je souhaiterais intégrer la ligne entière (sans couleur si ça plante) ou juste le mot "Démarré" ou "Arrêtée" (si l'appli plante).

Merci pour tes réponses enrichissantes

 

 

 

Link to post
Share on other sites
Il y a 18 minutes, jakol a écrit :

2) oui je souhaiterais intégrer la ligne entière (sans couleur si ça plante) ou juste le mot "Démarré" ou "Arrêtée" (si l'appli plante).

Exemple de capture d'info avec sed:

  • pour faire la capture d'une partie de la ligne, il faut la «décrire» et entourer entre parenthèses les infos intéressantes
  • on passe sed en mode «print» (/p à la fin)
  • pour un peu plus de clarté (ou plutôt un peu moins d’obscurité), on utilise l’option -r de sed qui permet de ne pas mettres des caractères d’échappement partout

--> sed -rn 's/Statut de l'\''application (.*) sur .*\.\.\.(.*)\(pid :(.*)\).*$/\1 \2 \3/p'

  • Statut de l'\''application (.*) sur .*\.\.\.(.*)\(pid :(.*)\).*$: description de la ligne
    • le premier (.*) va capturer le nom de l’appli avec les parenthèses (capture 1)
    • le second (.*) suit les «...» du message mais précède «(pid :», ce sera donc «Démarrée» ou «Arrêtée» (avec les espaces avant par contre)
    • le troisième (.*) capture le numéro de process
    • tout le reste sert à «matcher» la ligne (notamment le $ à la fin qui signifie «fin de la ligne» pour caler l’interpréteur, j’aurais dû mettre un «^» au début pour caler le début
  • \1 \2 \3: demande à sed d'afficher la capture 1, puis la 2, puis la 3
  • p: commande d’affichage du résultat
echo "Statut de l'application (Espaces Collaboratifs) sur collab-app1.in.ac-strasbourg.fr ... Démarrée (pid : 2508)"|sed -rn 's/Statut de l'\''application (.*) sur .*\.\.\.(.*)\(pid :(.*)\).*$/\1 \2 \3/p'
(Espaces Collaboratifs)  Démarrée   2508


ATTENTION:

  • ce type de fonctionnement est peu permissif: tout changement dans le message fourni en entrée fera échouer sed (genre une mise à jour qui te repasse en anglais de message)

 

Autre solution, plus simple, qui capture «Démarrée» ou «Arrêtée»

sed -rn 's/.*(Démarrée|Arrêtée).*/\1/p'
 

root@octopus:~# echo "Statut de l'application (Espaces Collaboratifs) sur collab-app1.in.ac-strasbourg.fr ... Démarrée (pid : 2508)"|sed -rn 's/.*(Démarrée|Arrêtée).*/\1/p'
Démarrée

 

Il y a 4 heures, jakol a écrit :

J'ai effectivement posté la demande ailleurs...J'espère que vous ne le prenez pas mal....

Impardonnable.

Link to post
Share on other sites

La preuve on ne lui répond plus

 

il y a une heure, jakol a écrit :

1) oui

effectivement :

 head -1  statutCollab.txt  > etat.txt | sed 's/.*/"Démarrée"/g' etat.txt
"Démarrée"

2) oui je souhaiterais intégrer la ligne entière (sans couleur si ça plante) ou juste le mot "Démarré" ou "Arrêtée" (si l'appli plante).

Merci pour tes réponses enrichissantes

 

 

 

Ben ma commande fonctionne. Je n'ai toujours pas vu le résultat chez toi...

Link to post
Share on other sites
Il y a 39 minutes, brice.wernet a écrit :

Exemple de capture d'info avec sed:

  • pour faire la capture d'une partie de la ligne, il faut la «décrire» et entourer entre parenthèses les infos intéressantes
  • on passe sed en mode «print» (/p à la fin)
  • pour un peu plus de clarté (ou plutôt un peu moins d’obscurité), on utilise l’option -r de sed qui permet de ne pas mettres des caractères d’échappement partout

--> sed -rn 's/Statut de l'\''application (.*) sur .*\.\.\.(.*)\(pid :(.*)\).*$/\1 \2 \3/p'

  • Statut de l'\''application (.*) sur .*\.\.\.(.*)\(pid :(.*)\).*$: description de la ligne
    • le premier (.*) va capturer le nom de l’appli avec les parenthèses (capture 1)
    • le second (.*) suit les «...» du message mais précède «(pid :», ce sera donc «Démarrée» ou «Arrêtée» (avec les espaces avant par contre)
    • le troisième (.*) capture le numéro de process
    • tout le reste sert à «matcher» la ligne (notamment le $ à la fin qui signifie «fin de la ligne» pour caler l’interpréteur, j’aurais dû mettre un «^» au début pour caler le début
  • \1 \2 \3: demande à sed d'afficher la capture 1, puis la 2, puis la 3
  • p: commande d’affichage du résultat

echo "Statut de l'application (Espaces Collaboratifs) sur collab-app1.in.ac-strasbourg.fr ... Démarrée (pid : 2508)"|sed -rn 's/Statut de l'\''application (.*) sur .*\.\.\.(.*)\(pid :(.*)\).*$/\1 \2 \3/p'
(Espaces Collaboratifs)  Démarrée   2508


ATTENTION:

  • ce type de fonctionnement est peu permissif: tout changement dans le message fourni en entrée fera échouer sed (genre une mise à jour qui te repasse en anglais de message)

 

Autre solution, plus simple, qui capture «Démarrée» ou «Arrêtée»

sed -rn 's/.*(Démarrée|Arrêtée).*/\1/p'
 


root@octopus:~# echo "Statut de l'application (Espaces Collaboratifs) sur collab-app1.in.ac-strasbourg.fr ... Démarrée (pid : 2508)"|sed -rn 's/.*(Démarrée|Arrêtée).*/\1/p'
Démarrée

 

Impardonnable.

🐵

À l’instant, jakol a écrit :

🐵

lol

 

Link to post
Share on other sites

Merci

la commande fonctionne

image.png.723d61bfd5a3e0dcaa9e9b13016b1453.png

Mais désolé

 je souhaiterais qu'il y ait le message dessous  après le sed. Je cherche à comprendre mais pour te dire ça me paraît complexe... (Démarrée|Arrêtée) sont des variantes qui changent mais pas "Statut.....collab-app". Je n'arrête pas de le dire mais merci

Statut de l'application (Espaces Collaboratifs) sur collab-app1.in.ac-strasbourg.fr  Démarrée

ou
Statut de l'application (Espaces Collaboratifs) sur collab-app (il y a un app1 et un app2)Démarrée

image.png

Link to post
Share on other sites

Bonjour,

j'ai fait un script qui marche

#!/bin/sh
initCollab=`./init/collab status >statutCollab.txt && sed 's/\x1b//g' statutCollab.txt |sed 's/\[1;32m//g'|sed 's/\[0;39m//g'`

m="l'application collab est "

messageCollab=`sed -rn 's/.*(Démarrée|Arrêtée).*/\1/p' statutCollab.txt `

 

echo "$initCollab"| mail -s "$m$messageCollab" toto@pluton.fr

 

 

Le hic, c'est quand j'ouvre le mail, j'ai les codes suivants (dûs à messageCollab)

image.png.3a85d88ada186f1bd37af7f072030eb7.png

 

Avez-vous une idée pour enlever ces messages?

J'ai essayé de faire

messageCollab=`sed -rn 's/.*(Démarrée|Arrêtée).*/\1/p' statutCollab.txt >autrefichier`

mais la valeur (démarrée ou supprimée) n'est plus dans le titre du mail.

 

Merci pour votre retour.

 

 

 

 

Link to post
Share on other sites

j'ai rajouté head

messageCollab=`head -1 statutCollab.txt>etat.txt|sed -rn 's/.*(Démarrée|Arrêtée).*/\1/p' etat.txt

Ca semble ok 😀

 

Link to post
Share on other sites

Bonsoir,

 

j'ai constaté que quand j'ai lancé le script lancé à partir de la console  fonctionne nickel.

Par contre, lorsque je le cron; les accents é ne sont pas reconnus lorsqu'il y a la réception du mail. Il n'y a pas non plus de message dans le corps du mail .

1) exécution directe du script--> réception du mail

image.png.6fae7598e531ae82df0aa61415fae393.png

2) cron du script --> réception du mail

image.png.05bc527e70af4eb1eb65f8b50092da49.png

 

Je vous remercie de partager votre point de vue. Si possible, me guider pour une éventuelle solution.

Bien cordialement

 

Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...