Aquí hay una descripción general de los diferentes métodos que uno puede usar para buscar archivos de cadenas de texto específicas, con algunas opciones agregadas específicamente para trabajar solo con archivos de texto e ignorar los archivos binarios / de aplicación.
Sin embargo, se debe tener en cuenta que la búsqueda de palabras puede volverse un poco compleja, porque la mayoría de las herramientas de coincidencia de líneas tratarán de encontrar una palabra en cualquier lugar de la línea. Si estamos hablando de una palabra como cadena que podría aparecer al principio o al final de la línea, o sola en la línea, o rodeada de espacios y / o puntuación, es cuando necesitaremos expresiones regulares, y especialmente las que vienen de Perl. Aquí, por ejemplo, podemos utilizar -P
en grep
hacer uso de expresiones regulares de Perl para rodearlo.
$ 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
para búsqueda recursiva desde el directorio actual
-I
ignorar archivos binarios
-H
dar salida al nombre del archivo donde se encuentra la coincidencia
Apto solo para búsquedas.
encontrar + grep
$ find -type f -exec grep -IH 'word' {} \;
find
hace la parte de búsqueda recursiva
-I
la opción es ignorar archivos binarios
-H
dar salida al nombre del archivo donde se encuentra la línea
buen enfoque para combinar con otros comandos dentro de subshell, como:
$ 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 recursivo de los pobres en script bash recursivo
Esta es la "manera bash". No es ideal, probablemente no hay una buena razón para usar esto cuando lo tiene grep
o lo perl
instala.
#!/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 .
.