Bonjour a tous!
Ce que je demande doit etre d'une nullité absolue, mais j'ai vraiment besoin de votre aide
J'ai plusieurs fichiers (fich1, fich2,...fichn )contenant des sections de ce type :
Tue Jul 18 18:23:41 2006
ACTION : 'select * from demande where no_demande='D0605:0291''
DATABASE USER: '/'
PRIVILEGE : SYSDBA
CLIENT USER: oracle
CLIENT TERMINAL: pts/2
STATUS: 0
L'idée est d'obtenir le nom du fichier ainsi que la valeur de CLIENT USER, de comparer cette derniere valeur et me l'afficher à l'écran si elle ne correspond pas à la condition.
Je récupère bien le nom du fichier et la valeur de CLIENT USER dans une variable (je peux le mettre aussi dans un fichier, mais je ne sais pas la parcourir pour faire mon test)
valeur=`grep 'CLIENT USER' *.aud | cut -d ':' -f 1,3`
echo $valeur donne :
fich1: oracle
fich1: oracle
fich2: oracle
Merci d'avance
# Boucle for
Posté par peck (site web personnel) . Évalué à 4.
Ensuite tu peux faire ton grep à la place tu echo.
Tu peux aussi mettre toute instruction entre `` a la place de fich* pour trouver tout ce que tu veux, pratique pour utiliser un find ou pour faire un seq 1 10
[^] # Re: Boucle for => Alternative en while
Posté par Steve Azriel . Évalué à 3.
Une suggestion en boucle while:
===
grep 'CLIENT USER' *.aud | cut -d ':' -f 1,3 | \
while read nom valeur; do
echo "nom='${nom}' valeur='${valeur}'"
done
===
cela permet d'extraire les informations (ici on aura nom de la forme 'fich#:', et valeur='oracle').
Si besoin, nettoyer le nom du caractère ":" final...
Ainsi, dans la boucle du while, il sera possible de faire des tests pour chaque "ligne".
Cdlt,
[^] # Re: Boucle for => Alternative en while
Posté par BAud (site web personnel) . Évalué à 3.
gawk -F ':' '{ if ( $2 != "tata" ) print FILENAME ": " $2 ; }' *.aud
ne fonctionne-t-il pas ? (au pire utilise awk mais bon c'est limité à 3000 caractères dans mon [mauvais] souvenir)
[^] # Re: Boucle for => Alternative en while
Posté par totof2000 . Évalué à 4.
gawk -F ':' ' $2 != "tata" { print FILENAME ": " $2 ; }' *.aud
[^] # Re: Boucle for => Alternative en while
Posté par BAud (site web personnel) . Évalué à 2.
[^] # Re: Boucle for => Alternative en while
Posté par JIJO . Évalué à 1.
Je pense que je vais m'attarder sur la boucle while.
Il ne me reste plus qu'a personnaliser mon petit script pour m'envoyer un mail à la fin du traitement
Une derniere question J'ai rajouté un pipe dans ma commande principale, ce qui donne maintenant :
grep 'CLIENT USER' ora*.aud | egrep -v '(PBertrand|JDenis,oracle)' | cut -d ':' -f 1,3 | sort | uniq
Est ce une bonne chose de faire autant de pipe dans une commande ?
[^] # Re: Boucle for => Alternative en while
Posté par cho7 (site web personnel) . Évalué à 2.
ta vie sexuelle ne nous regarde pas
[^] # Re: Boucle for => Alternative en while
Posté par Steve Azriel . Évalué à 2.
La succession de commande "pipées" est une fonctionnalité très pratique (jusqu'à les faire en ligne de commande, à la volée ^__^) mais tout dépend du besoin.
L'enchaînement ne devrait pas poser de problème mais augmentera plus ou moins la "charge" de la machine avec plusieurs processus (au moins un par commande lancée, à priori le max dépendra du nombre de traitements lancés dans la boucle while), chacun et sa mémoire nécessaire, etc...
En outre, pour la relecture, ce n'est pas forcément le meilleur "format" car il est difficile de commenter à l'intérieur de l'enchaînement des commandes.... (la documentation du script, SVP !).
En terme de performances, je ne peux que conseiller de mesurer et de comparer (par exemple via la commande "time") différentes solutions.
Je soulignerais un point négatif concernant les erreurs qui surviennent en cours d'exécution des commandes "pipées" et qui ne sont pas alors forcément gérables dans le flot....
Sinon, concernant le "sort | uniq", j'utiliserais "sort -u" comme alternative pour faire un tri et de retirer les doublons.
Et, si possible, les solutions "awk(+sed)", "perl" & co: je dis OUI :-)
Bon courage !
Cdlt,
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.