2010-03-03 4 views
2

Je suis en train d'analyser un fichier de propriétés pour obtenir une liste de propriétés defiend. Je veux vérifier tous les endroits où ces propriétés sont utilisées (répertoire cible et sous-répertoires), en mettant en évidence ceux qui sont définis dans le fichier de propriétés mais qui ne sont utilisés nulle part dans le répertoire targer. Jusqu'à maintenant, j'aiScript UNIX pour une liste de chaînes trouvées dans aucun fichier

FILE=$1 
TARGETROOT=$2 

for LINE in `grep '[A-Z]*=' $FILE | awk -F '=' '{print$1}'`; 
do 

done; 

Dans cette boucle, je veux trouver les LINE $ vars qui ne sont pas dans TARGETROOT $ ou ses subdirs

Exemples de fichiers

Properties File 
a=1 
b=2 
c=3 
... 

De nombreux fichiers qui contiennent des références à propriétés via

FILE 1 
PropAValue = a 

Répondre

2

Vérifiez le code retour de grep.

Vous pouvez le faire en inspectant le $? variable.

si c'est 0 alors la chaîne a été trouvée, sinon la chaîne n'a pas été trouvée. Si ce n'est pas 0, ajoutez cette chaîne à un tableau 'not found' et cela devrait être votre liste de propriétés non trouvées.

grep "string" 
if [$? -ne 0] 
then 
    string not found 
fi 
+0

Ce son comme il pourrait être la réponse pouvez-vous me donner un exemple de la façon dont vous inspectez cela? –

+0

Le $? variable contient le code de sortie de la dernière commande exécutée. Quelque chose comme: grep "string" if [$?-ne 0] puis chaîne non trouvée fi –

+0

Ceci est-ce Merci !! –

1
  • En utilisant xyz | while read PROP au lieu de for PROP in ``xyz``; do pour les cas où xyz peut obtenir arbitrairement grand
  • En utilisant grep -l ... >/dev/null || xyz pour exécuter xyz si grep ne correspond pas, et jeter la sortie grep faire /dev/null sans exécuter xyz si l'on match est trouvé (-l arrête grep après le premier match, le cas échéant, le rendant plus efficace)

    FILE=$1 
    TARGETROOT=$2 
    
    grep '^[A-Z]*=' "$FILE2" | awk -F= '{print$1}' | while read PROP ; do 
        find "$TARGETROOT" -type f | while read FILE2 ; do 
        grep -l "^${PROP}=" "$FILE2" >/dev/null || { 
         echo "Propery $PROP missing from $FILE2" 
        } 
        done 
    done 
    

Si vous traitez avec un grand nombre de propriétés et/ou fichiers sous $TARGETROOT vous pouvez utiliser ce qui suit, une approche plus efficace (qui ouvre et analyse chaque fichier une seule fois au lieu de N fois de la solution précédente, où N était le nombre de propriétés à $FILE):

  • l'utilisation d'un fichier temporaire avec toutes les propriétés triées de $FILE pour éviter la duplication travail
  • l'utilisation awk ... | sort -u pour isoler toutes les propriétés triées apparaissant dans un autre fichier $FILE2
  • En utilisant comm -23 "$PROPSFILE" - pour isoler ces lignes (propriétés) qui apparaissent uniquement dans $PROPSFILE et non sur l'entrée standard (à savoir dans $FILE2)

    FILE=$1 
    TARGETROOT=$2 
    
    PROPSFILE="/tmp/~props.$$" 
    grep '^[A-Z]*=' "$FILE" | awk -F= '{print$1}' | sort -u >"$PROPSFILE" 
    
    find "$TARGETROOT" -type f | while read FILE2 ; do 
        grep '^[A-Z]*=' "$FILE2" | awk -F= '{print$1}' | sort -u | 
        comm -23 "$PROPSFILE" - | while read PROP ; do 
        echo "Propery $PROP missing from $FILE2" 
        done 
    done 
    
    rm -f "$PROPSFILE" 
    
+0

Parfois, 'grep + awk' peut être utilisé pour les gros fichiers. 'grep' pour rechercher un motif et' awk' pour le traiter. L'algorithme de recherche de 'grep' est meilleur. Dans votre script 'sed', vous faites une substitution, ce qui est une opération coûteuse. la division sur des champs avec 'awk' est beaucoup plus rapide. – ghostdog74

+0

correct, et il est supposé que '$ FILE' n'a pas une taille de mégaoctets pour que' sed' fonctionne efficacement. Dans ces cas, combiner 'grep' et' awk' dans 'awk -F = '$ 1 ~/^ [A-Z] * $/& & NF> 1 {print $ 1}'' serait moins redondant. J'ai mis à jour le deuxième exemple pour utiliser 'awk' au lieu de' sed'. – vladr

+0

vous pouvez même combiner 'sort -u | comm -23 .... | while..' dans 'awk';). 3 processus de tuyauterie en moins. – ghostdog74