1 votos

Devuelve sólo una línea por archivo con grep en Terminal

Varios mensajes en otros foros han sugerido que la mejor manera de utilizar grep para devolver una sola línea por archivo es utilizar -m 1 que es el --max-count opción. Sin embargo, cuando escribo la siguiente línea, obtengo sólo un archivo, no una línea por archivo:

grep -m 1 "library" ./ -R

Devuelve un solo archivo en una sola línea:

.//results/fig/fig_functions.R:# library(plyr)

Mientras que

grep "library" ./ -R

Devuelve muchos archivos, cada uno con varias líneas:

.//results/fig/fig_functions.R:# library(plyr)
.//results/fig/fig_functions.R:# library(grid)
.//src/rmd/genevese_params.html:library(sf) 
.//src/rmd/genevese_params.html:library(raster)
[many more lines and files...]

Me gustaría que el comando devolviera todo que contienen el texto, pero sólo devuelven una línea por archivo. ¿Estoy utilizando grep incorrectamente o hay otra forma de hacerlo?

2voto

Tom Harrington Puntos 187

No funciona como se esperaba porque los Macs utilizan una versión BSD de grep mientras que las respuestas que ves son para GNU grep como se encuentra en Linux. Son muy similares pero no idénticos, y manejan -m de manera diferente. BSD grep trata -m que cubre toda la salida, mientras que la versión de GNU es por archivo.

Una forma de obtener el resultado que describes es así:

find . -type f -exec grep -H -m1 library '{}' \;

Esto utiliza find para obtener la ruta de cada archivo en . (de forma recursiva, por lo que obtiene todos los subdirectorios) y luego ejecuta grep -m1 en cada uno de ellos. El -type f le dice a find para obtener sólo los archivos normales, no los directorios y otras cosas. El -H le dice a grep para imprimir los nombres de los archivos que coinciden, no sólo el texto que coincide.

Otra forma sería instalar GNU grep , utilizando Homebrew .

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X