Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/05/2017, à 17:30

Hackedia

[Résolu] SED, comportement bizarre !

Bonjour !

J'ai un script avec cette ligne de commande :

phrase=$( echo ${phrase} | sed -re 'y/àéè/aee/' )

J'ai testé en ligne de commande juste echo ${phrase} | sed -re 'y/àéè/aee/', avec une variable locale, et ça marche !
Et là dans mon script, ça me met cette erreur : sed: -e expression n°1, caractère 10: commande `y' inachevée

Si ça marche avec l'un mais pas avec l'autre, je vois mal un problème de syntaxe ou quoi, j'ai remarqué que ça pause un problème que quand je met des lettres avec accent dans la liste, bizarre.

J'ai essayé pas mal de chose, plus je cerne le problème, moins je comprend ^^.
J'aurais voulu avoir votre avis, je début avec sed et, on peut dire, avec le bash en général, il est possible que certaine notions ne soit pas acquises.

Merci pour votre attention, et vive linux big_smile

EDIT : Il semblerai que l'on ai eu le même problème que moi, et sans succès, je suis sous CentOS

Dernière modification par Hackedia (Le 24/05/2017, à 10:00)

Hors ligne

#2 Le 23/05/2017, à 17:42

pingouinux

Re : [Résolu] SED, comportement bizarre !

Bonjour,
Fais un copier-coller de tes commandes et du résultat (entre balises-code).

Hors ligne

#3 Le 23/05/2017, à 17:46

Hackedia

Re : [Résolu] SED, comportement bizarre !

Bonjour pingouinux !

Voici la partie en question de mon script :

	for i in `seq 1 $nombre_ligne`;
	do

		# Récupération des information du fichier de log par quartier (délimité par une suite de 15 "-"
		phrase=$( echo $(cat ${log}/bck.log ) | awk -v s=${i}  -F"----------------------------------------------------------------------" '{print $s}')
		
		#Manipulation de la chaine de caractère pour enlever les accents et codes couleurs
		phrase=$( echo ${phrase} | sed 's/[[0-9];[0-9][0-9]m//' )
		phrase=$( echo ${phrase} | sed 's/[[0-9]m//' )
		phrase=$( echo ${phrase} | sed -re 'y/àéè/aee/' )

		# Est ce que le message contient une erreur bloquante ?
		if [ "$( echo ${phrase} | grep -q 'Code retour : 110'; echo $?)" -eq "0" ] || [ "$( echo ${phrase} | grep -q 'Code retour : 2'; echo $?)" -eq "0" ] || [ "$( echo ${phrase} | grep -q 'Code retour : 1'; echo $?)" -eq "0" ] || [ "$( echo ${phrase} | grep -q 'Impossible de continuer'; echo $?)" -eq "0" ]; 
		then		
			((log_erreur++))
			output_long="${output_long} \n${phrase}"
			bloquant=1
		fi
		
		# Est ce que le message contient une erreur non bloquante ?
		if [ "$( echo ${phrase} | grep -q 'Impossible de supprimer le répertoire temporaire de sauvegarde'; echo $?)" -eq "0" ]; then		
			((log_erreur++))
			output_long="${output_long} \nImpossible de supprimer le répertoire temporaire de sauvegarde."
			nonbloquant=1
 		fi
		# Erreurs non bloquantes 
		if [ "$( echo ${phrase} | grep -q 'Tentative'; echo $?)" -eq "0" ]; then
			for j in `seq 1 10`;
			do
				phrase2=$(echo $phrase | awk -v s=${j} -F"Export" '{print $s}')
				if [ "$( echo ${phrase2} | grep -q 'Tentative'; echo $?)" -eq "0" ];
				then
					((log_echec++))
					output_long="${output_long} \nExport ${phrase2}"
					nonbloquant=1
				fi
			done
		fi
	done

Et voici la réponse de l'interpréteur :

sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée
sed: -e expression n°1, caractère 10: commande `y' inachevée

Edit : elle traite un fichier de log et sélectionne dans une variable certaines informations, pour des besoins particulier je dois enlever tout code couleur et accent.

Dernière modification par Hackedia (Le 24/05/2017, à 09:51)

Hors ligne

#4 Le 23/05/2017, à 17:50

Hackedia

Re : [Résolu] SED, comportement bizarre !

EDIT :
Quand je commente cette ligne je n'ai plus de soucis.
Si au lieu d'essayer de faire àéè/aee je fait aze/aee (cet exemple n'a pas de sens dans le contexte) ça marche, apparement les accent dans la commande sed crée des problèmes.

Dernière modification par Hackedia (Le 23/05/2017, à 17:51)

Hors ligne

#5 Le 23/05/2017, à 18:27

pingouinux

Re : [Résolu] SED, comportement bizarre !

Ton script me paraît inutilement compliqué, et encore je n'en vois qu'un bout…

Ajoute ceci

echo "=$phrase="
hd <<<"$phrase"

après cette ligne

phrase=$( echo $(cat ${log}/bck_full_centreon.log ) | awk -v s=${i}  -F"----------------------------------------------------------------------" '{print $s}')

et donne le retour de ces commandes.

Donne aussi le retour de

file le_nom_de_ton_script

Ajouté :
Je pense que ton script n'est pas en utf-8. On en aura le cœur net avec le résultat de la commande précédente.

Dernière modification par pingouinux (Le 23/05/2017, à 18:52)

Hors ligne

#6 Le 24/05/2017, à 09:33

Hackedia

Re : [Résolu] SED, comportement bizarre !

C'est bien possible, je fait mes débuts en bash.

Voici le retour de la commande file :

script.sh: POSIX shell script text executable

Je n'ai pas la commande hd, je ne connais pas le package associé, mais voici le contenu de phrase :

==
./script.sh: line 279: hd : commande introuvable
sed: -e expression n°1, caractère 10: commande `y' inachevée
= DEBUT DE L'EXECUTION : le 15/05/2017 à 12:23:01 =
./script.sh: line 279: hd : commande introuvable
sed: -e expression n°1, caractère 10: commande `y' inachevée
= Période de rétention défini à 14 jours. CREATION REPERTOIRE TEMPORAIRE mkdir /backup/20170515_122302_Central_backup SAUVEGARDE DES REPERTOIRES CENTREON tar -czf /backup/20170515_122302_Central_backup/etc_centreon.tar.gz /etc/centreon/ tar: Suppression de « / » au début des noms des membres tar -czf /backup/20170515_122302_Central_backup/etc_centreon-engine.tar.gz /etc/centreon-engine/ tar: Suppression de « / » au début des noms des membres tar -czf /backup/20170515_122302_Central_backup/etc_centreon-broker.tar.gz /etc/centreon-broker/ tar: Suppression de « / » au début des noms des membres tar -czf /backup/20170515_122302_Central_backup/var_lib_centreon.tar.gz /var/lib/centreon/ tar: Suppression de « / » au début des noms des membres tar -czf /backup/20170515_122302_Central_backup/var_lib_centreon-engine.tar.gz /var/lib/centreon-engine/ tar: Suppression de « / » au début des noms des membres tar -czf /backup/20170515_122302_Central_backup/var_lib_centreon-broker.tar.gz /var/lib/centreon-broker/ tar: Suppression de « / » au début des noms des membres tar -czf /backup/20170515_122302_Central_backup/etc_httpd.tar.gz /etc/httpd/ tar: Suppression de « / » au début des noms des membres tar -czf /backup/20170515_122302_Central_backup/etc_logrotated.tar.gz /etc/logrotate.d/ tar: Suppression de « / » au début des noms des membres tar -czf /backup/20170515_122302_Central_backup/var_log_centreon.tar.gz /var/log/centreon/ tar: Suppression de « / » au début des noms des membres tar -czf /backup/20170515_122302_Central_backup/var_log_centreon-engine.tar.gz /var/log/centreon-engine/ tar: Suppression de « / » au début des noms des membres tar -czf /backup/20170515_122302_Central_backup/var_log_centreon-broker.tar.gz /var/log/centreon-broker/ tar: Suppression de « / » au début des noms des membres tar -czf /backup/20170515_122302_Central_backup/usr_lib_nagios_plugins.tar.gz /usr/lib/nagios/plugins/ tar: Suppression de « / » au début des noms des membres tar -czf /backup/20170515_122302_Central_backup/usr_share_centreon.tar.gz /usr/share/centreon tar: Suppression de « / » au début des noms des membres tar -czf /backup/20170515_122302_Central_backup/usr_share_centreon-engine.tar.gz /usr/share/centreon-engine tar: Suppression de « / » au début des noms des membres tar -czf /backup/20170515_122302_Central_backup/etc_pki_tls.tar.gz /etc/pki/tls tar: Suppression de « / » au début des noms des membres tar -czf /backup/20170515_122302_Central_backup/etc_phpini.tar.gz /etc/php.ini tar: Suppression de « / » au début des noms des membres tar -czf /backup/20170515_122302_Central_backup/etc_postfix.tar.gz /etc/postfix tar: Suppression de « / » au début des noms des membres tar -czf /backup/20170515_122302_Central_backup/var_spool_centreon_ssh.tar.gz /var/spool/centreon/.ssh tar: Suppression de « / » au début des noms des membres VERIFICATION DES ARCHIVES TGZ : "/backup/20170515_122302_Central_backup/*.gz" gzip -t /backup/20170515_122302_Central_backup/*.gz EXPORT DES BASES DE DONNEES MYSQL Export de la base de données centreon  Echec d'éxecution de la commande. Tentative 1/1. =
./script.sh: line 279: hd : commande introuvable
sed: -e expression n°1, caractère 10: commande `y' inachevée
= ERREUR : mysqldump: Got error: 1045: "Access denied for user 'root'@'localhost' (using password: YES)" when trying to connect Code retour : 2 =
./script.sh: line 279: hd : commande introuvable
sed: -e expression n°1, caractère 10: commande `y' inachevée
= Export de la base de données centreon_storage  Echec d'éxecution de la commande. Tentative 1/1. =
./script.sh: line 279: hd : commande introuvable
sed: -e expression n°1, caractère 10: commande `y' inachevée
= ERREUR : mysqldump: Got error: 1045: "Access denied for user 'root'@'localhost' (using password: YES)" when trying to connect Code retour : 2 =
./script.sh: line 279: hd : commande introuvable
sed: -e expression n°1, caractère 10: commande `y' inachevée
= Export de la base de données mysql  Echec d'éxecution de la commande. Tentative 1/1. =
./script.sh: line 279: hd : commande introuvable
sed: -e expression n°1, caractère 10: commande `y' inachevée
= ERREUR : mysqldump: Got error: 1045: "Access denied for user 'root'@'localhost' (using password: YES)" when trying to connect Code retour : 2 =
./script.sh: line 279: hd : commande introuvable
sed: -e expression n°1, caractère 10: commande `y' inachevée
= EXPORT CSV DU PARAMETRAGE CENTREON Export Centreon de la configuration en fichier texte de type *.csv CREATION DE L'ARCHIVE DE SAUVEGARDE tar -czf /backup/20170515_122302_Central_backup.tar.gz /backup/20170515_122302_Central_backup/ tar: Suppression de « / » au début des noms des membres VERIFICATION DES ARCHIVES TGZ : "/backup/20170515_122302_Central_backup.tar.gz" gzip -t /backup/20170515_122302_Central_backup.tar.gz NETTOYAGE DES FICHIERS ET REPERTOIRES TEMPORAIRES rm -fr --preserve-root /backup/20170515_122302_Central_backup EPURATION SAUVEGARDES OBSOLETES find /backup -maxdepth 1 -type f -regextype posix-extended -regex ^/backup/[1-2][0-9][0-9][0-9][0-1][0-9][0-3][0-9]_[0-2][0-9][0-6][0-9][0-6][0-9]_Central_backup.tar.gz -mtime +14 -delete -print =
./script.sh: line 279: hd : commande introuvable
sed: -e expression n°1, caractère 10: commande `y' inachevée
= ERREUR : 3 erreurs lors de l'exécution du script de sauvegarde de la plateforme de supervision Central. Une vérification manuelle est obligatoire pour assurer l'intégrité des données. Code retour : 110 ABANDON DE LA SAUVEGARDE =
./script.sh: line 279: hd : commande introuvable
sed: -e expression n°1, caractère 10: commande `y' inachevée
= =
./script.sh: line 279: hd : commande introuvable
sed: -e expression n°1, caractère 10: commande `y' inachevée
= FIN DE L'EXECUTION : le 15/05/2017 à 12:23:18 =
./script.sh: line 279: hd : commande introuvable
sed: -e expression n°1, caractère 10: commande `y' inachevée
==
./script.sh: line 279: hd : commande introuvable
sed: -e expression n°1, caractère 10: commande `y' inachevée
==

Dernière modification par Hackedia (Le 24/05/2017, à 09:50)

Hors ligne

#7 Le 24/05/2017, à 09:49

pingouinux

Re : [Résolu] SED, comportement bizarre !

Peux-tu montrer la totalité de check_centreon_backup.sh ?

Sur la première ligne, tu peux essayer de remplacer sh par bash, mais je doute que ça change quelque chose.

Hors ligne

#8 Le 24/05/2017, à 09:55

Hackedia

Re : [Résolu] SED, comportement bizarre !

Il ne se passe pas grand chose avant et après, le script se base sur un fichier de log et essaye de relever uniquement les erreurs.
J'ai trouvé un équivalent qui marche bien et semble moins gourmand :

phrase=${phrase//à/a}
phrase=${phrase//é/e}
...

Merci de ton aide, je reste curieux de savoir ce qui peut empêcher le bon fonctionnement de sed.

EDIT : J'ai vérifié mes variables et les commandes sed ne modifient rien à ma variable, bizarre. Je suis en train de passer sur du Parameter Expansion, il parait que ça vaut le coup !

Dernière modification par Hackedia (Le 24/05/2017, à 10:35)

Hors ligne

#9 Le 24/05/2017, à 12:44

pingouinux

Re : [Résolu] SED, comportement bizarre !

Je pense que le problème vient de l'encodage du script, mais il faudrait que tu le montres, et ça permettrait aussi de le simplifier.

Hors ligne

#10 Le 24/05/2017, à 15:44

Hackedia

Re : [Résolu] SED, comportement bizarre !

Je suis en train de me poser une question,
Le fichier de log sur lequel je travail est codé en UTF-8 Unicode text, with escape sequences.
Quand je récupère sont contenu, je récupère aussi des caractères spéciaux que sed tente peut être d'interprété, (d'ailleurs j'ai essayé divers commandes, ça ne marche toujours pas, des fois la variable se vide en sortit, ou alors ça ne modifie rien).

Voici comment est codé le fichier de log :

...
        SAUVEGARDE DES REPERTOIRES
^[[2;32mtar -czf /test/backup/centreon.tar.gz /etc/centreon/^[[0m
tar: Suppression de « / » au début des noms des membres
...

On voit bien des caractères bizarres (pour revenir à la ligne, modifier les couleurs) qui doivent peut être empécher une lecture propre de sed ou du parameter expansion. Une idée de comment éviter ça ? J'ai éssayer des guillemets ou antislash, mais ça ne semble pas fonctionner.

EDIT: Désolé je ne peut pas te montrer mon script en entier, mais je peut te dire que sur un mini script avec le même encodage que j'ai fait à l'occasion pour tester, ça ne marche également pas :

#!/bin/sh

log_file=$(echo $(cat /fichier.log))
log_file=$(var=${log_file}; var=${var//é/e}; var=${var//à/a})

echo $log_file

Dernière modification par Hackedia (Le 24/05/2017, à 16:00)

Hors ligne

#11 Le 25/05/2017, à 10:33

pingouinux

Re : [Résolu] SED, comportement bizarre !

Tant mieux si tu as résolu ton problème, mais voici un test qui me fait suspecter l'encodage de ton script, et pas les données.
Voici un script en utf8.

$ cat mon_script_utf8.sh
#!/bin/sh
echo "$1" | sed 'y/à/a/'

Création d'un script identique, avec un encodage différent (latin1).

$ iconv -t latin1 mon_script_utf8.sh >mon_script_latin1.sh

$ file mon_script_utf8.sh mon_script_latin1.sh
mon_script_utf8.sh:   POSIX shell script, UTF-8 Unicode text executable
mon_script_latin1.sh: POSIX shell script, ISO-8859 text executable

$ chmod 700 mon_script_utf8.sh mon_script_latin1.sh

Exécution des 2 scripts

$ ./mon_script_utf8.sh abc
abc

$ ./mon_script_latin1.sh abc
sed: -e expression #1, char 6: unterminated `y' command

Hors ligne

#12 Le 29/05/2017, à 11:08

Hackedia

Re : [Résolu] SED, comportement bizarre !

Ah d'accord !
Je fait du dos2unix à tout mes scripts, et quand je regarde l'encodage ça me met "POSIX shell script text executable" c'est du coup peut être pas encodé en utf8.
Merci de tes précisions !

Hors ligne