Grep per questo e NON quello in un file?


0

Come posso grep per i file in una struttura di directory che hanno questo testo

addDesignControlChangeNotification

ma manca questo testo

removeDesignControlChangeNotification

Grazie!

Nota: intendo la directory in cui inizia lo script e tutte le sottodirectory.


Hmm, nella directory principale o nella directory principale e nelle sottodirectory?
Rich Homolka,

Intendo la directory in cui iniziamo la sceneggiatura e tutte le sottodirectory. Spiacente, non era chiaro prima.
Dan Rosenstark,

Risposte:


1

Eccone uno vagamente basato sulla risposta di Rich Homolka , ma funziona su alberi di directory:

find . -type f  -exec grep -l addDesignControlChangeNotification {} \; | 
 while IFS= read -r file; do 
   grep -q removeDesignControlChangeNotification "$file" > /dev/null ; 
   [ $? -ne 0 ] && echo $file; 
 done

Tutti i file restituiti conterranno addDesignControlChangeNotificationma non removeDesignControlChangeNotification.

SPIEGAZIONE:

  • find . -type f -exec grep -l foo {} \;: Questo stamperà tutti i file in qualsiasi sottodirectory della directory corrente che contiene la stringa foo. Il -lflag fa in modo che grep stampi solo i nomi dei file corrispondenti.

  • while read file: questo scorre attraverso ogni file trovato sopra, salvandone il nome nella variabile $file.

  • grep -q bar "$file" > /dev/null: questo comando richiede la stringa barin ciascuno dei file che contiene foo.

  • [ $? -ne 0 ] && echo $file;: Se il valore restituito ( $?) del grepcomando era 0 (ovvero se la stringa non era nel file), stampare il nome del file.


Fantastico, sto usando quello find . -name '*.m' -type f -exec grep -l addDesignControlChangeNotification {}... che mi sono aggiunto da quando non ne ho parlato nella domanda;) Grazie!
Dan Rosenstark,

2

questo dovrebbe funzionare:

FIRST=addDesignControlChangeNotification
SECOND=removeDesignControlChangeNotification
grep -l $FIRST * | while IFS= read -r FILE
do
    grep $SECOND "$FILE" &> /dev/null
    if [ $? -ne 0 ]
    then
        echo "File $FILE has $FIRST but not $SECOND"
    fi
done

Sembra fantastico, ma sto ottenendo "È una directory" invece di entrare effettivamente in quelle directory. Qualche idea di cosa c'è che non va? Grazie +1!
Dan Rosenstark,

@Yar, è possibile aggiungere un -ral primo grepcomando se si desidera ricorrere alle directory. Oppure puoi usare la mia risposta;).
terdon,

0

Una fodera:

comm -2 -3 <(grep -rl addDesignControlChangeNotification     . | sort ) \
           <(grep -rl removeDesignControlChangeNotification  . | sort )

grep -rè un grep ricorsivo, <()è una sostituzione di processo e commmostra linee che una coppia di file (ordinati) ha / non ha in comune. In questo caso vogliamo solo l'output della colonna 1: righe nel primo file (dove "file" è in realtà un output grep) che non sono nel secondo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.