Vérifier la présence d'un mot dans une ligne

Résolu/Fermé
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 - 3 mai 2011 à 18:28
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 - 5 mai 2011 à 14:52
Bonjour,
Je voudrais savoir comment parcourir un fichier et tester pour chaque ligne s'il contient un mot donné afin d'exécuter un script particulier lorsqu'elle contient le mot.
En shell bourne.
Merci d'avance.

A voir également:

11 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
3 mai 2011 à 18:46
Salut,

while read ligne
do
grep -q 'motif' <<<${line}
if [ "$?" -eq "0" ]
then blablabla
else blablabla
fi
done < fichier


Mais bon, ça reste très schématique et sûrement pas adapté à 100% à ton cas ;-((
0
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
4 mai 2011 à 09:50
J'ai une erreur à chaque fois.[CODE]syntax error at line n°: '<' unexpected[/CODE]
C'est un script sh que j'exécute.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
4 mai 2011 à 09:53
Désolé mais j'ai perdu ma boule de cristal ;-((

Sans voir le code difficile de faire quoi que ce soit ;-\
0
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
Modifié par Decon le 4/05/2011 à 10:15
Désolé, voici le code:
#liste les logs du plus recent au plus ancien 
find /InstancesArbor/CATDEV3/KBP_APPLI/y/log \( -name 'Nom.0.2-29*.*.log' -o -name 'Nom.0.2-3[0-9]*.*.log' \) -ls | grep -v 'Nom.0.2-29.core_bp_duct_educt.*.log' | sort -r -n -t. +3 > tmp.file 

while read ligne 
 do 
  grep -q 'Nom.0.2-29.2*.log' <<<${line} 
  if [ "$?" -eq "0" ]  
  then  
   echo "blabla"  
  fi 
 done < tmp.file


Aussi, est-ce possible de mettre le grep à l'intérieur du if, parce que j'ai l'impression que le code actuel me permet de tester la présence que d'un mot; alors que je veux en tester plusieurs avec pour chacun une action spéciale.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
4 mai 2011 à 10:17
Et que contient "tmp.file" ???

Déjà à 1ère vue, la présence de l'astérisque dans le motif de recherche ne me parait pas du meilleur goût, ne serait-ce que par la présence de quotes simples autour du motif et de l'absence de l'option "-E" de grep ;-((
0
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
Modifié par Decon le 4/05/2011 à 10:31
tmp.file contient :
-rw-rw-r--   1 arbdev3  arboradm    7679 May  2 11:53 Nom.0.2-30.20110502.115217.log 
-rwxr-xr-x   1 arbdev3  arboradm   15647 May  2 11:45 Nom.0.2-29.20110502.114254.log 
-rwxr-xr-x   1 arbdev3  arboradm   15698 May  2 11:01 Nom.0.2-29.20110502.105858.log 
-rwxr-xr-x   1 arbdev3  arboradm    3622 Apr 29 17:31 Nom.0.2-30.20110429.173020.log 
-rwxr-xr-x   1 arbdev3  arboradm   13596 Apr 14 13:05 Nom.0.2-29.20110414.130358.log 
-rwxr-xr-x   1 arbdev3  arboradm    5650 Apr 14 13:02 Nom.0.2-30a.20110414.130157.log 
-rwxr-xr-x   1 arbdev3  arboradm    5636 Apr 14 13:01 Nom.0.2-30.20110414.130115.log


J'ai mis -Eq et "" à la place de '', j'ai un message: Illégale option -E , -q
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
4 mai 2011 à 10:32
Le but c'est de matcher ces trois lignes :

Nom.0.2-29.20110502.114254.log
Nom.0.2-29.20110502.105858.log
Nom.0.2-29.20110414.130358.log
0
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
4 mai 2011 à 10:44
Non, le but est de parcourir le fichier et pour chaque ligne, vérifier si elle contient 29, excécuter la tâche correspondant à 29, si 30 ..., si 29a .., 30a .., ainsi de suite.
ces n° étant les chiffres juste avant la date.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
4 mai 2011 à 11:06
Dans ton exemple (grep -q 'Nom.0.2-29.2*.log') le but était bien de matche les 3 lignes sus-citées quand même non ? ;-\

Donc à partir de là :

$ egrep 'Nom.0.2-29.*.log' plop
-rwxr-xr-x   1 arbdev3  arboradm   15647 May  2 11:45 Nom.0.2-29.20110502.114254.log
-rwxr-xr-x   1 arbdev3  arboradm   15698 May  2 11:01 Nom.0.2-29.20110502.105858.log
-rwxr-xr-x   1 arbdev3  arboradm   13596 Apr 14 13:05 Nom.0.2-29.20110414.130358.log

$ egrep 'Nom.0.2-30.*.log' plop
-rw-rw-r--   1 arbdev3  arboradm    7679 May  2 11:53 Nom.0.2-30.20110502.115217.log
-rwxr-xr-x   1 arbdev3  arboradm    3622 Apr 29 17:31 Nom.0.2-30.20110429.173020.log
-rwxr-xr-x   1 arbdev3  arboradm    5650 Apr 14 13:02 Nom.0.2-30a.20110414.130157.log
-rwxr-xr-x   1 arbdev3  arboradm    5636 Apr 14 13:01 Nom.0.2-30.20110414.130115.log

$

etc.

;-))
0
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
4 mai 2011 à 11:16
je vois ce que tu veux dire; mais les lignes du fichier tmp.file sont déjà dans un certains ordre et l'exécution des tâches associées à chaque ligne doit se faire dans ce même ordre. C'est pour cela que je ne souhaite pas ramener toutes les lignes contenant 29, puis 30, ..
Ce que je veux faire c'est de parcourir dans l'odre le fichier et exécuter les tâches dans ce même ordre.
J'espère avoir été un peu plus clair.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
4 mai 2011 à 11:35
Ok. Un exemple avec dans le fichier "plop" le contenu de ton exemple plus haut...

$ cat foo.sh
#! /bin/bash

while read line
do
A=$(egrep -o '\.2-..' <<<${line})
case ${A} in
.2-29)  echo "${line##* } contient 29"
        ;;
.2-30)  echo "${line##* } contient 30"
        ;;
esac
done < plop

$ ./foo.sh
Nom.0.2-30.20110502.115217.log contient 30
Nom.0.2-29.20110502.114254.log contient 29
Nom.0.2-29.20110502.105858.log contient 29
Nom.0.2-30.20110429.173020.log contient 30
Nom.0.2-29.20110414.130358.log contient 29
Nom.0.2-30a.20110414.130157.log contient 30
Nom.0.2-30.20110414.130115.log contient 30

$
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
4 mai 2011 à 11:51
Merci de ton aide,
En revanche, es tu sûr que ça fonctionne de la même manière en bin/sh, parce que j'ai le message d'erreur:
syntax error at line 32: 'A=$' unexpected

Voici mon code complet
#!/bin/sh

#Vérification des patchs installés
#*****************************************************

#liste les logs du plus recent au plus ancien
find /InstancesArbor/CATDEV3/KBP_APPLI/y/log \( -name 'Nom.0.2-29*.*.log' -o -name 'Nom.0.2-3[0-9]*.*.log' \) -ls | grep -v 'Nom.0.2-29.core_bp_duct_educt.*.log' | sort -r -n -t. +3 > tmp.file

while read line
do
A=$(egrep -o '\.2-..' <<<${line})
case ${A} in
.2-29)  echo "${line##* } contient 29"
        ;;
.2-30)  echo "${line##* } contient 30"
        ;;
esac
done < tmp.file
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
4 mai 2011 à 12:07
Sur quel système es-tu ?
Ou quelle distrib ?

Que renvoie la commande :
ls -l /bin/sh
0
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
4 mai 2011 à 12:50
lrwxrwxrwx 1 root root 13 Jan 6 2009 /bin/sh -> ../../sbin/sh
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
4 mai 2011 à 13:02
Et les réponses aux 2 questions ?
0
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
Modifié par Decon le 4/05/2011 à 13:13
Unix, SunOS 5.10
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
4 mai 2011 à 13:20
Ok.

Essaie de remplacer "A=$(egrep -o '\.2-..' <<<${line})" par :

A=$(echo "${line}" | egrep -o '\.2-..' )
0
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
4 mai 2011 à 13:32
Je l'ai testé et j'ai la même erreur.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
4 mai 2011 à 13:38
Tu peux rajouter "set -xv" après ton shebang, lancer le script et afficher la sortie s'il te plait, merci ;-))

#!/bin/sh
set -xv
0
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
4 mai 2011 à 13:39
D'accord
0
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
4 mai 2011 à 13:45
find /InstancesArbor/CATDEV3/KBP_APPLI/y/log \( -name 'Nom.0.2-29*.*.log' -o -name 'Nom.0.2-3[0-9]*.*.log' \) -ls | grep -v 'Nom.0.2-29.core_bp_duct_educt.*.log' | sort -r -n -t. +3 > tmp.file
+ find /InstancesArbor/CATDEV3/KBP_APPLI/y/log ( -name Nom.0.2-29*.*.log -o+  -namesort  Nom.0.2-3[0-9]*.*.log ) -r -ls+ -n grep  -t.-v  +3NEUF_TELECOM_CEG_ENT_BP12.0.2-29.core_bp_duct_educt.*.log



while read line
do
#A=$(grep -o '\.2-..' <<<${line})
A=$(etest.sh: syntax error at line 9: 'A=$' unexpected
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
4 mai 2011 à 13:49
Bon, on va essayer autrement ;-\

Remplace "A=$(echo "${line}" | egrep -o '\.2-..' )" par :

A='echo "${line}" | egrep -o '\.2-..''

Attention c'est des quotes-inversées (Alt Gr + 7 le 7 du clavier alphanumérique)
0
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
4 mai 2011 à 13:57
Le message d'erreur a changé. Maintenant j'ai:
egrep: illegal option -- o
usage: egrep [ -bchilnsv ] [ -e exp ] [ -f file ] [ strings ] [ file ] ...
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
4 mai 2011 à 14:07
Ok.

Essayons comme ça :

#! /bin/bash

while read line
do
A='echo ${line} | egrep '\.2-..''
case ${A##*-} in
29*)	echo "${line##* } contient 29"
	;;
30*)	echo "${line##* } contient 30"
	;;
esac
done <tmp.file  
0
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
Modifié par Decon le 4/05/2011 à 14:31
Je l'ai fais. Il me renvoie l'erreur "bas substitition" quand je le fais sous bin/sh; mais en mettant bin/bash, ça marche.
Suis je obligé de le faire sous bash, Parce qu'en réalité, mon script est beaucoup plus long et le reste s'exécute avec sh.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
4 mai 2011 à 14:41
"bad substitution"
Faudrait savoir ce qu'il n'aime pas ;-\
A mon avis c'est les "${A##*-}" et les "${line##* }"

Essaie comme ça :

#! /bin/sh

while read line
do
A='echo ${line} | egrep '\.2-..''
A='echo ${A} | awk -F'-' '{print $NF}''
case ${A} in
29*)	echo "${line} contient 29"
	;;
30*)	echo "${line} contient 30"
	;;
esac
done <tmp.file
0
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
4 mai 2011 à 14:53
Ca marche!!!
SUPER MERCI.
T'es trop sympa.
Je ne sais pas comment te dire merci; mais MERCi tout simplement.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
4 mai 2011 à 16:11
De rien ;-))
0
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
Modifié par Decon le 5/05/2011 à 13:54
Bonjour,
Je reviens suite à un problème de EOF que je rencontre; notament le message suivant lors du parcours de mon fichier par le read line:
** ERROR ** EOF encountered while reading standard in. Now exiting...
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
5 mai 2011 à 13:57
Affiche ton code ainsi que le contenu de ton fichier tmp.file. (si confidentiel, tu peux mettre les fichiers sur ci-joint et m'envoyer l'adresse par MP)
0
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
Modifié par Decon le 5/05/2011 à 14:27
On fait comment pour envoyer des fichiers joints?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
5 mai 2011 à 14:26
0
Decon Messages postés 91 Date d'inscription mercredi 29 août 2007 Statut Membre Dernière intervention 8 octobre 2014 2
5 mai 2011 à 14:39
Je ne trouve pas l'onglet message privé sur ton profil
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
5 mai 2011 à 14:44
Oups il était désactivé ;-(

Ça devrait être bon ;-))
0