Ecco una panoramica dei diversi metodi che è possibile utilizzare per cercare file per stringhe di testo specifiche, con alcune opzioni aggiunte in modo specifico per lavorare solo con file di testo e ignorare i file binari / applicativi.
Si dovrebbe notare, tuttavia, che la ricerca di parole può diventare un po 'complessa, poiché la maggior parte degli strumenti di corrispondenza delle linee tenterà di trovare una parola in qualsiasi punto della linea. Se stiamo parlando di una parola come stringa che potrebbe apparire all'inizio o alla fine della linea, o da sola sulla linea, o circondata da spazi e / o punteggiatura - è allora che avremo bisogno di espressioni regolari, e specialmente di quelle che vengono dal Perl. Qui, per esempio, possiamo usare -P
in grep
per usare le espressioni regolari del Perl per circondarlo.
$ printf "A-well-a don't you know about the bird?\nWell, everybody knows that the bird is a word" | grep -noP '\bbird\b'
1:bird
2:bird
Grep semplice
$ grep -rIH 'word'
-r
per la ricerca ricorsiva giù dalla directory corrente
-I
per ignorare i file binari
-H
per generare il nome del file dove viene trovata la corrispondenza
Adatto solo per la ricerca.
trova + grep
$ find -type f -exec grep -IH 'word' {} \;
find
fa la parte di ricerca ricorsiva
-I
l'opzione è di ignorare i file binari
-H
per generare il nome del file dove si trova la linea
buon approccio per la combinazione con altri comandi all'interno di subshell, come:
$ find -type f -exec sh -c 'grep -IHq "word" "$1" && echo "Found in $1"' sh {} \;
Perl
#!/usr/bin/env perl
use File::Find;
use strict;
use warnings;
sub find_word{
return unless -f;
if (open(my $fh, $File::Find::name)){
while(my $line = <$fh>){
if ($line =~ /\bword\b/){
printf "%s\n", $File::Find::name;
close($fh);
return;
}
}
}
}
# this assumes we're going down from current working directory
find({ wanted => \&find_word, no_chdir => 1 },".")
grep ricorsivo mans-mans in script bash ricorsivo
Questa è la "via bash". Non è l'ideale, probabilmente non c'è una buona ragione per usarlo quando lo hai installato grep
o perl
installato.
#!/usr/bin/env bash
shopt -s globstar
#set -x
grep_line(){
# note that this is simple pattern matching
# If we wanted to search for whole words, we could use
# word|word\ |\ word|\ word\ )
# although when we consider punctuation characters as well - it gets more
# complex
case "$1" in
*word*) printf "%s\n" "$2";;
esac
}
readlines(){
# line count variable can be used to output on which line match occured
#line_count=1
while IFS= read -r line;
do
grep_line "$line" "$filename"
#line_count=$(($line_count+1))
done < "$1"
}
is_text_file(){
# alternatively, mimetype command could be used
# with *\ text\/* as pattern in case statement
case "$(file -b --mime-type "$1")" in
text\/*) return 0;;
*) return 1;;
esac
}
main(){
for filename in ./**/*
do
if [ -f "$filename" ] && is_text_file "$filename"
then
readlines "$filename"
fi
done
}
main "$@"
grep -r word .
.