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 -n
y, -l
pero 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?
Respuestas:
Creo que
-l
es 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
-o
imprimir solo la parte que coincida.grep -nHo "search" *
fuente
grep -rin searchstring * | cut -d: -f1-2
Esto diría, busque de forma recursiva (para la cadena
searchstring
en 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 auniq
, de modo que solo vea cada nombre de archivo una vez:grep -ir searchstring * | cut -d: -f1 | uniq
fuente
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 :)fuente
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
fuente
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.
fuente