C'est d'ailleurs une des raisons pour choisir un langage plus avancé (perl, python et compagnie) même en script dès que les traitements se compliquent.
Il est assez fréquent de voir un script bouclant des milliers de fois sur 2 seds et un awk avec un pipe… sur le serveur, ça se traduit par une charge 100% système pendant un bout de temps, et l'admin qui met du temps à trouver le coupable…
]]>Merci de cette information
]]>Pour info, vous pouvez vous séparer du "sed 's/ //g'" en utilisant les options -t et -A de psql et ainsi formater sa sortie à votre besoin, sans espaces...
]]>seq="`sudo -u <<user>> psql <<base>> -t -c "select nextval('sequence')" | sed 's/ //g'`"
le sed permet de supprimer les espace.
Un exemple de function pl/sh avec utilisation de nawk pour mise en forme du résultat
Recherche dans un fichier xml ($2) de plusieurs balises pour récuperer l'information contenu dans celle-ci avec les commandes grep, cut, sed
Le sed permet de reformater la date avec des tirets
Je passe la variable de la séquence à nawk avec le -v id_client=$3
appel de la function
sudo -u <<user>> psql <<base>> -c "select sh_client('<<repertoire>>','<<fichier>>',$seq);"
CREATE OR REPLACE FUNCTION sh_client(repertoire text, fichier text, seq integer)
RETURNS integer AS
$BODY$#!/bin/sh
cd $1
grep -E "<Nom>|<TypeMessage>|<DomaineDeFlux>|<Date>" $2 | cut -d">" -f2 | cut -d"<" -f1 | sed "s/[/]/-/g" |
nawk -v id_client=$3 '{cp=split($0,st,"-")} \
{if (cp!=1) ligne=ligne" "st[3]"-"st[2]"-"st[1]","; \
else
ligne=ligne"\047"$0"\047,";
}END{gsub(" ","",id_client);
ligne=id_client" "ligne;
ligne="Insert into clients values ("substr(ligne,1,length(ligne)-1)");";
print ligne > "'client.sql'"}'
exit 0$BODY$
LANGUAGE 'plsh' VOLATILE
COST 100;
ALTER FUNCTION sh_client(text, text,integer) OWNER TO postgres;
Enfin j'injecte dans ma base le fichier résultant.
sudo -u <<user>> psql <<base>> -q -f "client.sql"
J'aurai pu aussi le faire dans la fonction mais j'ai contaté qu'avec plusieurs lignes, les performances sont diminuées.
]]>