2010-02-15 10 views
0

J'ai un chargement de fichiers avec des commandes sql, on m'a demandé d'extraire tous les noms de tables de base de données à partir des fichiers Comment puis-je utiliser grep et sed pour analyser les fichiers et créer une liste des noms de tables uniques dans un fichier texte ..un par ligne?commande grep et sed

les noms de tous les noms semblent commencer par "db_" ce qui est pratique!

Quelle serait la meilleure façon d'utiliser grep et sed ensemble pour retirer les noms de tables?

+1

Pouvez-vous poster un exemple de ce que les fichiers SQL ressemblent? –

+1

Presque toutes les réponses que vous obtenez de sed/grep vont surtout confirmer votre hypothèse. C'est à dire. Si vous commencez par rechercher 'db_', c'est exactement ce que vous obtiendrez, quelle que soit sa précision - toutes les chaînes commençant ainsi seront affichées, même si ce ne sont pas des noms de tables, et les chaînes qui ne correspondent pas à ce modèle ne seront pas affichées, même si elles se réfèrent à des tableaux. Malheureusement, une réponse correcte nécessitera un analyseur SQL (presque) complet ... –

Répondre

6

Ceci recherchera les lignes contenant les noms des tables. La sortie de ce va rapidement révéler si une recherche plus sélective est nécessaire:

grep "\<db_[a-zA-Z0-9_]*" *.sql 

Une fois la recherche appropriée est triée, retirez tous les autres personnages de lignes avec les noms de tables:

grep "\<db_[a-zA-Z0-9_]*" *.sql | sed 's/.*\(\<db_[a-zA-Z0-9_]*\).*/\1/' 

Une fois c'est en cours d'exécution, ajouter une sorte et supprimer les doublons:

(same last pipe expression) | sort | uniq 
+1

+1. Pour attraper potentiellement plusieurs noms de tables dans la même ligne, vous pouvez diviser les lignes avec tr: 'grep .. * .sql | tr '' '\ n' | grep .. | sed'. Le premier grep est pour alléger le fardeau de 'tr', le second grep consiste à filtrer les parties non" db_ ". – orip

0

vous avez juste besoin grep

grep -owE "db_[a-zA-Z0-9]+" file|sort -u 

ou awk

awk '{for(i=1;i<=NF;i++)if($i~/^db_[a-zA-Z0-9]+/){print $i} }' file 
Questions connexes