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 -
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.
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
- Vérifier si mot de passe piraté - Guide
- Aller à la ligne dans une cellule excel - Guide
- Mot de passe - 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.