GNU/Linux >> Linux Esercitazione >  >> Linux

Ricerca di una stringa in un numero di file in LInux

Soluzione 1:

Potresti usare grep:

grep -rn 'classname' /path/to/source

Questo stamperà anche il numero di riga accanto a ogni corrispondenza.

Senza distinzione tra maiuscole e minuscole:

grep -rin 'classname' /path/to/source

Cerca in modo non ricorsivo in tutti i file cpp:

grep -n 'classname' /path/to/source/*.cpp

Soluzione 2:

Tutte le risposte di cui sopra funzioneranno perfettamente, ma potrebbero causare falsi positivi se hai la stringa in qualcosa di più del semplice codice sorgente. Supponiamo che tu stia cercando dove usi la classe FooBar in un progetto java, puoi cercare tutti i file denominati *.java e grep solo quelli.

# grep "FooBar" -Hn $(find -name "*.java")

La sezione tra $() si espanderà all'output di quel comando. Il -H stampa il nome del file. È l'impostazione predefinita in cui è presente più di un nome di file, ma lo aggiungiamo esplicitamente qui nel caso in cui l'espansione restituisca solo un nome di file. Il -n stampa il numero di riga della corrispondenza.

Funzionerà per piccoli progetti, ma se hai a che fare con un progetto più grande, c'è la possibilità che find si espanda a una stringa più lunga del limite della riga di comando. È quindi più sicuro usare:

# find -name "*.java" -print0 | xargs -0 grep "FooBar" -Hn 

xargs prenderà l'input dallo standard in e lo dividerà in modo che si adatti alla riga di comando, eseguendo il comando più volte se necessario. I -print0 e -0 sono necessari per gestire file con spazi nel nome.

Puoi anche cercare tutti i nomi di file con una corrispondenza usando:

# find -name "*.java" -print0 | xargs -0 grep "FooBar" -l

Il -l visualizzerà solo il nome del file e smetterà di cercare in un particolare file non appena trova una corrispondenza.

Se farai spesso questo genere di cose, potresti voler guardare uno strumento come ctags o tag esuberanti, che mantengono un indice di ricerca del tuo codice sorgente e possono rispondere rapidamente a questo tipo di domande. Sia vim che emacs supportano questi strumenti. Potresti anche dare un'occhiata a un IDE come Eclipse, che può fare molto bene i riferimenti incrociati.

(So ​​che stavi cercando una definizione di classe, ma in Java una classe sarà definita in un file con lo stesso nome della classe. Se stavi facendo cpp, potresti fare qualcosa del tipo:

# find -name "*.cpp" -o -name "*.cc" -o -name "*.h" -o -name "*.hpp" -print0 | \
  xargs -0 egrep "class\s+FooBar" -Hn 

Soluzione 3:

Per la ricerca nel codice sorgente, ho scoperto che ack (betterthangrep.com) è, per citare il marketing, migliore di grep. Il suo output è più facile da leggere e farà molte cose automaticamente, come ignorare i file di codice non sorgente:directory VCS (ad es. CVS e .svn), file di backup.

Soluzione 4:

ack è migliore per la ricerca di codici sorgente poiché riconosce già alcune delle estensioni di file più popolari (c, perl, ecc.). È veloce come grep e per impostazione predefinita ignora tutti i tuoi artefatti di controllo della versione. Ad esempio, se vuoi cercare un codice sorgente perl di pattern che potresti usare

ack --perl pattern

invece di

grep pattern $(find . -name '*.pl' -or -name '*.pm' -or -name '*.pod' | grep -v .svn)

Linux
  1. Come aumentare il limite del numero di file aperti in Linux

  2. Linux:come sapere per cosa Grep in Dmesg?

  3. linux:cerca i file di tipo *.php recentemente modificati

  4. grep in modo ricorsivo per un tipo di file specifico su Linux

  5. Escludere i file nascosti durante la ricerca con Unix/Linux find?

Come copiare un gran numero di file in Linux

Linux cerca la stringa nelle cartelle e nei file con ack

Trova testo nei file su Linux usando grep

Conta il numero di file in una directory in Linux

Come contare il numero di file in una directory in Linux

Dropbox configurato per un server cloud Linux