2009-11-12 6 views
1

Je tente de nettoyer une base de données existante en supprimant toutes les procédures qui ne sont pas utilisées par l'application. En utilisant grep, j'ai pu déterminer qu'une seule procédure ne se produisait pas dans le code source. Y a-t-il un moyen de faire cela pour toutes les procédures à la fois? MISE À JOUR: Lors de l'utilisation de -E "proc1 | proc2" produit une sortie de toutes les lignes dans tous les fichiers qui correspondent à l'un ou l'autre motif, ce n'est pas très utile. La base de données existante a plus de 2 000 procédures.Rechercher des procédures stockées non référencées dans le code source

J'ai essayé d'utiliser l'option -o en pensant que je pouvais utiliser sa sortie comme motif pour une recherche inverse sur le motif original. Cependant, j'ai trouvé qu'il n'y a pas de sortie lorsque vous utilisez l'option -o avec plus d'un modèle.

D'autres idées? MISE À JOUR: Après d'autres expériences, j'ai trouvé que c'est la combinaison des options -i et -o qui empêche la sortie. Malheureusement, j'ai besoin d'une recherche insensible à la casse dans ce contexte.

+0

Quelle version de 'grep', quel shell (et version), et quelle distribution? Utilisez -v' comme l'une des options de 'grep'? Voir ma réponse éditée. –

Répondre

1

Commencez par la liste des noms de procédure.Pour réutiliser facilement plus tard, les trier et les rendre minuscules, comme ceci:

tr "[:upper:]" "[:lower:]" < list_of_procedures | sort > sorted_list_o_procs 

... maintenant vous avez une liste triée des noms de procédure. On dirait que vous utilisez déjà grep gnu, donc vous avez l'option -o. Notez l'utilisation de fgrep: ce ne sont pas des regexps, vraiment, alors pourquoi les traiter comme tel. J'espère que vous trouverez également que cela corrige magiquement vos problèmes de sortie;). Maintenant vous avez une liste moche des procédures utilisées. Nettoyons-les comme nous l'avons fait la liste originale ci-dessus.

tr "[:upper:]" "[:lower:]" < list_of_used_procs | sort -u > short_list 

Vous avez maintenant une courte liste des procédures utilisées. Trouvons ceux de la liste originale qui ne sont pas dans la liste restreinte.

fgrep -v -f short_list sorted_list_o_procs 

... et ils sont là.

4

alimente la liste des procédures stockées à egrep séparées par "|"

ou:

for stored_proc in $stored_procs 
do 
grep $stored_proc $source_file 
done 
4

J'ai eu à le faire dans le passé aussi bien. Ne pas oublier les procs qui peuvent être appelés d'autres procs. Si vous utilisez SQL Server, vous pouvez utiliser ceci:

SELECT nom, texte DE sysobjects A REJOIGNEZ syscomments B SUR A.id = B.id OÙ xtype = 'P' et le texte LIKE ' % < nom sproc>% de »

+0

+1 pour la suggestion check else - mais ne vous arrêtez pas avec d'autres procs mais aussi des jobs, des packages DTS/SSIS, des clients de reporting, etc. Heck, j'ai vu un ancien code concaténant des chaînes pour former un nom de procédure stockée (beurk). :) – Mayo

2

je reçois la sortie dans les circonstances décrites dans votre édition:

$ echo "aaaproc1bbb" | grep -Eo 'proc1|proc2' 
proc1 
$ echo $? 
0 
$ echo "aaabbb" | grep -Eo 'proc1|proc2' 
$ echo $? 
1 

Le code de sortie indique s'il n'y avait pas de match.

Vous pouvez également trouver ces options à grep utiles (-L peuvent être spécifiques à GNU grep):

 
-c, --count 
       Suppress normal output; instead print a count of matching lines 
       for each input file. With the -v, --invert-match option (see 
       below), count non-matching lines. (-c is specified by POSIX.) 

-L, --files-without-match 
       Suppress normal output; instead print the name of each input 
       file from which no output would normally have been printed. The 
       scanning will stop on the first match. 

-l, --files-with-matches 
       Suppress normal output; instead print the name of each input 
       file from which output would normally have been printed. The 
       scanning will stop on the first match. (-l is specified by 
       POSIX.) 

-q, --quiet, --silent 
       Quiet; do not write anything to standard output. Exit 
       immediately with zero status if any match is found, even if an 
       error was detected. Also see the -s or --no-messages option. 
       (-q is specified by POSIX.) 

Désolé pour citer la page man à vous, mais parfois, il aide à filtrer les choses un peu.

Modifier:

Pour une liste des noms de fichiers qui ne contiennent aucune des procédures (insensible à la casse):

grep -EiL 'proc1|proc2' * 

Pour une liste des noms de fichiers qui contiennent l'une des procédures (cas insensible):

grep -Eil 'proc1|proc2' * 

Pour afficher la liste des fichiers et montrer le match (insensible à la casse):

grep -Eio 'proc1|proc2' * 
+0

Merci par exemple. J'aurai besoin de faire un peu plus de recherches pour savoir pourquoi je n'obtiens pas les résultats escomptés. –

Questions connexes