Mostrar nombre de archivo y número de línea en la salida grep

87

Estoy tratando de buscar en mi directorio de rieles usando grep. Estoy buscando una palabra específica y quiero grep para imprimir el nombre del archivo y el número de línea.

¿Hay una bandera grep que haga esto por mí? He estado tratando de usar una combinación de -ny, -lpero estos están imprimiendo los nombres de los archivos sin números o simplemente arrojando una gran cantidad de texto al terminal que no se puede leer fácilmente.

ex:

  grep -ln "search" *

¿Necesito conectarlo a awk?

trev9065
fuente

Respuestas:

138

Creo que -les demasiado restrictivo ya que suprime la salida de -n. Sugeriría -H( --with-filename): Imprime el nombre de archivo para cada coincidencia.

grep -Hn "search" *

Si eso da demasiado resultado, intente -oimprimir solo la parte que coincida.

grep -nHo "search" * 
hablo adorado
fuente
Esta respuesta también funcionó para mí. Necesitaba buscar de forma recursiva y utilicé este comando de ejemplo: grep -Hnor "localhost". Esto escucha todas las coincidencias con el nombre del archivo y el número de línea, breve y conciso.
Tore Aurstad
Esto también muestra el resultado y no solo el nombre del archivo y el número de línea
elegible el
30
grep -rin searchstring * | cut -d: -f1-2

Esto diría, busque de forma recursiva (para la cadena searchstringen este ejemplo), ignorando el caso y mostrando los números de línea. La salida de ese grep se verá así:

/path/to/result/file.name:100: Line in file where 'searchstring' is found.

A continuación, canalizamos ese resultado al comando cut usando dos puntos :como nuestro delimitador de campo y mostrando los campos 1 a 2.

Cuando no necesito los números de línea que uso a menudo -f1(solo el nombre de archivo y la ruta), y luego canalizo la salida a uniq, de modo que solo vea cada nombre de archivo una vez:

grep -ir searchstring * | cut -d: -f1 | uniq
JBW
fuente
1
Siento que esto responde mejor a la pregunta original. Solo nombres de archivo y números de línea.
mastaBlasta
1
Tenga en cuenta que esto no funciona si tiene nombres de ruta absolutos de Windows como `C: \ Users \ me \ git` ya que ya contiene dos puntos.
hirse
19

Me gusta usar:

grep -niro 'searchstring' <path>

Pero eso es solo porque siempre olvido las otras formas y no puedo olvidar Robert de grep -niro por alguna razón :)

Bas van Ommen
fuente
Nunca pensé que obtendría votos a favor por lo anterior. Solo una divertida acción. ¡Gracias! (Pero realmente funciona, al menos en MacOS)
Bas van Ommen
¡Amo tu forma de recordar esto!
Greg Hilston
0

El comentario de @ToreAurstad se puede escribir grep -Horn 'search' ./, lo que es más fácil de recordar.

grep -HEroine 'search' ./ también podría funcionar;)

Para los curiosos:

$ grep --help | grep -Ee '-(H|E|r|o|i|n|e),'
  -E, --extended-regexp     PATTERNS are extended regular expressions
  -e, --regexp=PATTERNS     use PATTERNS for matching
  -i, --ignore-case         ignore case distinctions
  -n, --line-number         print line number with output lines
  -H, --with-filename       print file name with output lines
  -o, --only-matching       show only nonempty parts of lines that match
  -r, --recursive           like --directories=recurse
Ictus
fuente
0

Así es como utilicé la respuesta votada a favor para buscar en un árbol y encontrar los archivos fortran que contienen una cadena:

find . -name "*.f" -exec grep -nHo the_string {} \;

Sin el nHo, solo aprende que algún archivo, en algún lugar, coincide con la cadena.

Karl I.
fuente