Vérifier la présence d'un mot dans une ligne
Résolu
Decon
Messages postés
95
Statut
Membre
-
Decon Messages postés 95 Statut Membre -
Decon Messages postés 95 Statut Membre -
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.
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:
- Vérifier la présence d'un mot dans une ligne
- Partager photos en ligne - Guide
- Trousseau mot de passe iphone - Guide
- Mot de passe - Guide
- Vérifier si mot de passe piraté - Guide
- Verifier compatibilite windows 11 - Guide
11 réponses
Salut,
Mais bon, ça reste très schématique et sûrement pas adapté à 100% à ton cas ;-((
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 ;-((
J'ai une erreur à chaque fois.[CODE]syntax error at line n°: '<' unexpected[/CODE]
C'est un script sh que j'exécute.
C'est un script sh que j'exécute.
Désolé, voici le code:
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.
#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.
tmp.file contient :
J'ai mis -Eq et "" à la place de '', j'ai un message: Illégale option -E , -q
-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
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à :
etc.
;-))
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.
;-))
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.
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.
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
$
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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:
Voici mon code complet
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
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
Le message d'erreur a changé. Maintenant j'ai:
egrep: illegal option -- o usage: egrep [ -bchilnsv ] [ -e exp ] [ -f file ] [ strings ] [ file ] ...
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.
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.
"bad substitution"
Faudrait savoir ce qu'il n'aime pas ;-\
A mon avis c'est les "${A##*-}" et les "${line##* }"
Essaie comme ça :
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
Ca marche!!!
SUPER MERCI.
T'es trop sympa.
Je ne sais pas comment te dire merci; mais MERCi tout simplement.
SUPER MERCI.
T'es trop sympa.
Je ne sais pas comment te dire merci; mais MERCi tout simplement.