¿Cómo limito el número de resultados devueltos por grep?

180

Me gustaría decir 10 líneas como máximo de grep.

No quiero que mi computadora trabaje duro. Quiero que se detenga después de 10 resultados encontrados por grep. ¿Es posible?

Jas
fuente
En su caso, no desea que la computadora trabaje duro ... Pero si es solo un problema de legibilidad humana, puede usarla a lesstravés de una tubería. Eso llenará la pantalla y puede presionar ENTER para ver más líneas y qsalir:grep "SomeText" somefile.csv | less
SilentSteel

Respuestas:

240

La -mopción es probablemente lo que estás buscando:

grep -m 10 PATTERN [FILE]

De man grep:

-m NUM, --max-count=NUM
        Stop reading a file after NUM matching lines.  If the  input  is
        standard  input  from a regular file, and NUM matching lines are
        output, grep ensures that the standard input  is  positioned  to
        just  after the last matching line before exiting, regardless of
        the presence of trailing context lines.  This enables a  calling
        process  to resume a search.

Nota: ¡grep deja de leer el archivo una vez que se ha encontrado el número especificado de coincidencias!

Erik Pilz
fuente
3
hola lo intentó, básicamente funciona, pero no parece que el grep "pare" de pensar después de encontrar las primeras 10 líneas, parece que continúa pensando y "usando mi CPU" y simplemente no dice que es correcto. thansk
Jas
66
@ Jason: este no parece ser el caso: grep toma 0.005s con -m 1y 1.579s sin en un archivo con 10 millones de líneas en mi computadora portátil.
Grégoire
3
La conexión en tailgeneral generalmente va a funcionar, pero se desglosa particularmente si está trabajando con el contexto, por ejemplo grep -A10 PATTERN, usando tailtrunca el contexto, en lugar de la cantidad de resultados. Esta respuesta fue lo que estaba buscando.
dimo414
1
-m 10¡es la opción que marca la diferencia al agrupar múltiples archivos! La canalización a la cabeza no mostrará coincidencias en los archivos posteriores si hay demasiadas coincidencias en el primer archivo. Gracias !
Julien
1
En mi humilde opinión, esto debe marcarse como la respuesta aceptada, ya que no requiere otra herramienta. Por cierto, es más fácil recordar esta opción cuando se sabe que es el atajo de --max-count
ishahak
68

Otra opción es solo usar head :

grep ...parameters... yourfile | head

Esto no requerirá buscar en todo el archivo; se detendrá cuando se encuentren las primeras diez líneas coincidentes. Otra ventaja de este enfoque es que no devolverá más de 10 líneas, incluso si está utilizando grep con la opción -o.

Por ejemplo, si el archivo contiene las siguientes líneas:

112233
223344
123123

Entonces esta es la diferencia en la salida:

$ grep -o '1.' tu archivo | cabeza -n2
11
12

$ grep -m2 -o '1.'
11
12
12

El uso headdevuelve solo 2 resultados según lo deseado, mientras que -m2 devuelve 3.

Mark Byers
fuente
3
Tenga en cuenta que no puede usar la | headtubería cuando usa grepcon -Ao -B(y, por lo tanto, no solo busca el resultado ( -o), sino también el contexto). En ese caso, le queda -mdecirle a grep el número de líneas con resultados que se devolverán.
Atila O.
17
El uso de head no impide que grep se ejecute en todo el archivo. Usar la opción -m en grep sí.
LopSae
7

Enfoque Awk:

awk '/pattern/{print; count++; if (count==10) exit}' file
Kurumi
fuente
0

Usando cola:

#dmesg 
...
...
...
[132059.017752] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
[132116.566238] cfg80211: Calling CRDA to update world regulatory domain
[132116.568939] cfg80211: World regulatory domain updated:
[132116.568942] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132116.568944] cfg80211:   (2402000 KHz - 2472000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568945] cfg80211:   (2457000 KHz - 2482000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568947] cfg80211:   (2474000 KHz - 2494000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)
[132116.568948] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568949] cfg80211:   (5735000 KHz - 5835000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132120.288218] cfg80211: Calling CRDA for country: GB
[132120.291143] cfg80211: Regulatory domain changed to country: GB
[132120.291146] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | head 2
head: cannot open 2 for reading: No such file or directory
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -2
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -5
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -6
[132120.291146] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ 
Alex.gonzalez
fuente
Puede configurar el "formato de código" haciendo clic en el icono como "{}" en el editor.
peterh - Restablecer Monica
sería útil proporcionar ejemplos más legibles que loooonl loooog liiines
Putnik
0

Para 2 casos de uso:

  1. Solo quiero n resultados generales, no n resultados por archivo, grep -m 2es la ocurrencia máxima por archivo.
  2. A menudo uso git greplo que no toma-m

Una buena alternativa en estos escenarios es grep | sed 2qgrep 2 primeras ocurrencias en todos los archivos. documentación de sed: https://www.gnu.org/software/sed/manual/sed.html

Emily
fuente