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

Résolu
Decon Messages postés 91 Date d'inscription   Statut Membre Dernière intervention   -  
Decon Messages postés 91 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention   2
 
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention   2
 
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention   2
 
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention   2
 
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention   2
 
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention   2
 
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention   2
 
lrwxrwxrwx 1 root root 13 Jan 6 2009 /bin/sh -> ../../sbin/sh
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
Et les réponses aux 2 questions ?
0
Decon Messages postés 91 Date d'inscription   Statut Membre Dernière intervention   2
 
Unix, SunOS 5.10
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention   2
 
Je l'ai testé et j'ai la même erreur.
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention   2
 
D'accord
0
Decon Messages postés 91 Date d'inscription   Statut Membre Dernière intervention   2
 
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention   2
 
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention   2
 
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   Statut Contributeur Dernière intervention   6 431
 
"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   Statut Membre Dernière intervention   2
 
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   Statut Contributeur Dernière intervention   6 431
 
De rien ;-))
0
Decon Messages postés 91 Date d'inscription   Statut Membre Dernière intervention   2
 
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention   2
 
On fait comment pour envoyer des fichiers joints?
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
0
Decon Messages postés 91 Date d'inscription   Statut Membre Dernière intervention   2
 
Je ne trouve pas l'onglet message privé sur ton profil
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
Oups il était désactivé ;-(

Ça devrait être bon ;-))
0