Voici un aperçu des différentes méthodes que vous pouvez utiliser pour rechercher dans des fichiers des chaînes de texte spécifiques, avec quelques options ajoutées spécifiquement pour travailler uniquement avec les fichiers texte et ignorer les fichiers binaires / d'application.
Il convient toutefois de noter que la recherche d'un mot peut devenir un peu complexe, car la plupart des outils de correspondance de lignes tenteront de trouver un mot n'importe où sur la ligne. Si nous parlons d'un mot en tant que chaîne pouvant apparaître au début ou à la fin de la ligne, ou seul sur la ligne, ou entouré d'espaces et / ou de ponctuation, nous aurons alors besoin d'expressions régulières, et surtout de celles qui viennent de Perl. Ici, par exemple, nous pouvons utiliser -P
in grep
pour utiliser des expressions régulières Perl pour l’entourer.
$ 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 simple
$ grep -rIH 'word'
-r
pour la recherche récursive du répertoire courant
-I
ignorer les fichiers binaires
-H
pour sortir le nom du fichier où la correspondance est trouvée
Convient uniquement à la recherche.
trouver + grep
$ find -type f -exec grep -IH 'word' {} \;
find
fait la recherche récursive
-I
l'option est d'ignorer les fichiers binaires
-H
pour sortir le nom du fichier où la ligne est trouvée
bonne approche pour combiner avec d’autres commandes dans le sous-shell, comme par exemple:
$ 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 récursif des pauvres hommes dans le script bash récursif
C'est la "voie bash". Pas idéal, probablement pas une bonne raison de l'utiliser lorsque vous avez grep
ou perl
installé.
#!/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 .
.