grep: lista el nombre del archivo donde se encuentra la coincidencia


31

Tengo un montón de archivos .html en un directorio. Quiero mirar a través de cada archivo y hacer coincidir un patrón (MD5). Todo eso es bastante fácil. El problema es que necesito saber en qué archivo se encontró la coincidencia.

cat *.html | grep 75447A831E943724DD2DE9959E72EE31

Solo devuelve el contenido de la página HTML donde se encuentra la coincidencia, pero no me dice el archivo en el que se encontró. ¿Cómo puedo obtener grep para mostrarme el nombre del archivo donde se encuentra mi coincidencia?


La sugerencia proporcionada realmente no funciona ... Todo lo que obtengo es 'entrada estándar' cat * .html | grep -i -H 1ee024007823cc0bfbefba98ba1e1f4c (entrada estándar): <html> <head> <title>
BeMy Friend

44
te estás perdiendo el punto. No necesitas usar gato. El gato evita que grep distinga archivos individuales.
Muru

Puede que le resulte útil esta publicación de desbordamiento de pila .
Pablo A

Respuestas:


32
grep -H 75447A831E943724DD2DE9959E72EE31 *.html

-H, --with-filename
              Print the file name for each match. This is
              the default when there is more than one file
              to search.

3
Como dice, ese es el valor predeterminado para varios archivos, por lo tanto, siempre que haya más de un archivo html, -Hno es necesario.
muru

1
Lo siento, mi pregunta fue ofensiva. Debería haber dicho que he estado trabajando en esto por un tiempo y he usado varios interruptores Y he leído la página MAN donde dice que enumera el nombre de archivo por defecto ... Pero lo que obtengo es (entrada estándar ) donde debería listar el nombre del archivo.
BeMy Friend

y eso es solo si le doy el interruptor -H. Si solo hago lo que enumeré en el OP, entonces no proporciona ningún nombre de archivo.
BeMy Friend

3
@BeMyFriend, el problema es cat. catsignifica concatenar. Si concatena todos los archivos juntos antes de pasarlos grep, grepvea solo un gran archivo de entrada estándar y no puede (salvo adivinar) devolverle información sobre los archivos individuales. ¿Ver?. Cyrus, ¿qué hay de explicar esto en la respuesta?
Rmano

OK, el problema es el comando cat, pero ¿qué puede ser una solución?
Josef Klimuk

21

Lo uso todo el tiempo para buscar archivos que contienen una cadena, RECURSIVAMENTE en un directorio (eso significa, atravesar cualquier sub sub sub sub carpeta) grep -Ril "yoursearchtermhere"

  • R es buscar de forma recursiva (siguiendo enlaces simbólicos)
  • i es hacerlo insensible a mayúsculas y minúsculas
  • l es solo para enumerar el nombre de los archivos.

entonces responder a su pregunta grep -l '75447A831E943724DD2DE9959E72EE31' *.htmlservirá, pero puede hacerlo grep -Ril '75447A831E943724DD2DE9959E72EE31'para buscar esa cadena, sin distinción entre mayúsculas y minúsculas, en cualquier archivo en cualquier subcarpeta


macOS requiere un archivo def siempre, puede ser un comodín. De lo contrario, supone la entrada de stdin( grep: advertencia: búsqueda recursiva de stdin , cualquier entrada de stdin recursiva significaría :-). En otras palabras:grep -Ril 'texttofind' *
Ville

grep -RiH 'pattern'muestra el nombre de los archivos y la línea coincidente
Ikrom

7

Puedes probar esto

grep -rl '75447A831E943724DD2DE9959E72EE31' * > found.txt

2
grep -r -H 75447A831E943724DD2DE9959E72EE31 *.html | awk -F : ' { print $1 } '

Alternativa a

grep -r -l 75447A831E943724DD2DE9959E72EE31 *.html

Al hacer lo anterior, buscará recursivamente en la carpeta y subcarpetas e imprimirá la ruta del archivo ...


grep -r -l es lo único que me funcionó.
Josef Klimuk

0

La respuesta publicada por Cyrus es absolutamente correcta y es The Right Way TM para hacerlo grepsi solo necesitamos encontrar archivos . Cuando los nombres de archivo necesitan un análisis u operaciones adicionales en los nombres de archivo coincidentes, podemos recurrir al uso de whileloop con ifdeclaración. Aquí hay un ejemplo en el que la lista de nombres de archivos proviene de una estructura find+ muy utilizada whilepara un análisis seguro de los nombres de archivos.

find -type f -name "*.html" -print0 | while IFS= read -r -d '' filename
do
    if grep -q 'PATTERN' "$filename"
    then
        printf "%s found in %s\n" 'PATTERN' "$filename"
        # Here we can insert another command or function
        # to perform other operations on the filename
    fi
done

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.