Ho bisogno di grep alcuni file per vedere quali contengono una determinata parola:

grep -l word * 

Successivamente ho bisogno di grep quellelenco di file per vedere quali contengono una parola diversa. Il modo più semplice sarebbe probabilmente scrivere uno script ma non so come farlo funzionare.

Commenti

  • Quale grep? GNU grep? Sei su Linux, Solaris, i BSD?
  • I ' m utilizzando Linux.

Risposta

Supponendo che nessuno dei nomi di file contenga spazi bianchi, virgolette singole, virgolette doppie o barre rovesciate (o iniziare con – con GNU grep), puoi fare:

grep -l word * | xargs grep word2 

Xargs eseguirà il secondo grep su ogni file dal primo grep.

Con GNU grep / xargs o compatibile, puoi renderlo più affidabile con:

grep -lZ word ./* | xargs -r0 grep word2 

Lutilizzo di -Z rende grep stampa i nomi dei file delimitati da NUL in modo che possano essere utilizzati con xargs -0. Lopzione -r per xargs evita che il secondo grep venga eseguito se il primo grep non trova nulla.

Risposta

grep -l word1 $(grep -l word2 *) 

o forse per una delle due parole sulla stessa riga:

grep -w "word1\|word2" * 

vedi qui

Risposta

Se devi trovare file contenenti una parola e poi filtrare quei file che contengono unaltra parola, potresti utilizzare una sequenza di comandi come questa:

grep word * | awk -F ":" "{print $1}"|uniq | xargs grep word2 
  • grep word *: mostrerà tutti i file contenenti “word”, il nome del file sarà il primo nellelenco.
  • awk -F ":" "{print $1}" – stamperà solo il nome del file dei risultati
  • uniq – farà in modo di non stampare il nome del file più di una volta.
  • xargs grep word2 – cercherà di nuovo nellelenco dei file che hai ottenuto.

Commenti

  • @don_crissti Ma la combinazione di pezzi grep -l word1 * | xargs -d'\n' grep -l word2 funziona per qualsiasi cosa tranne il newline, il che è abbastanza strano che quasi nessuno lo usa.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *