2012-01-06 23 views

Respuesta

103

La magia de las tuberías;

head -10 log.txt | grep <whatever> 
+4

también puede canalizar una secuencia arbitraria a 'head':' someCmd | head -10 ' –

+0

La cabecera imprime por defecto las primeras 10 líneas a la salida estándar, por lo que esto es válido para 10 líneas' head log.txt | grep ' – Zlemini

+0

¿Hay alguna manera de hacer esto al usar la opción' -l' de grep? Me gustaría enumerar todos los archivos cuyos primeros 5 caracteres son 'RIFFD'. –

6

Tiene algunas opciones para usar programas junto con grep. El más simple en mi opinión es el uso de head:

head -n10 filename | grep ... 

head dará salida a las primeras 10 líneas (usando la opción -n), y luego se puede canalizar esa salida a grep.

+2

que ni siquiera darse cuenta, todas las soluciones aquí usando '' head' han utilizado -n 10' ** (incluido yo) ** sin darse cuenta de que 'head' por ** default ** muestra *** solo 10 líneas ***. :) –

+0

Oh _goodness_ eso es correcto ... –

2

La salida de head -10 file se puede canalizar a grep con el fin de lograr esto:

head -10 file | grep … 

Utilizando Perl:

perl -ne 'last if $. > 10; print if /pattern/' file 
2

Usted puede utilizar la siguiente línea:

head -n 10 /path/to/file | grep [...] 
18

O utilizar awk para un único proceso sin |:

awk '/your_regexp/ && NR < 11' INPUTFILE 

En cada línea, si your_regexp partidos, y el número de registros (líneas) es menor que 11, se ejecuta la acción predeterminada (que es la impresión de la entrada línea).

O utilice sed:

sed -n '/your_regexp/p;10q' INPUTFILE 

comprueba su expresión regular e imprime la línea (-n medios no publique la entrada, que es lo contrario el valor por defecto), y se cierra inmediatamente después de la línea 10.

+1

¿Por qué no renunciar el día 10? (ver solución sed) – potong

+0

'awk '{if (NR <= 10) {if (índice ($ 0," ab ")> 0) {imprimir $ 0; }} else {exit; }} 'textfile' - más rápido. –

+1

@potong tienes razón, corregido. @srikanthradix, aunque puede ser más rápido tu solución no está buscando expresiones regulares, sino solo cadenas fijas. 'awk '{if (NR <= 10) {if ($ 0 ~" YOUR_REGEXP ") {print}} else {exit; }} 'textfile' hace. –

3
grep "pattern" <(head -n 10 filename) 
29

Para la gente que encuentran esto en Google, que tenía que buscar en los primeros n líneas de varios archivos, pero sólo para imprimir los nombres de archivo coincidentes. Solía ​​

gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames 

Los FNR..nextfile deja de procesar un archivo se han visto una vez 10 líneas. El //..{} imprime el nombre del archivo y se mueve cada vez que aparece la primera coincidencia en un archivo determinado. Para citar los nombres de archivo para el beneficio de otros programas, utilice

gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames 
+3

Fui una de esas personas que encontraron esto en Google. ¡Gracias! – Floris

+0

para mí, este código imprimió la ruta completa del archivo. Que es exactamente lo que necesitaba. También 'FNR = 1' solo buscará 1ra línea. ¡Gracias! –

1

grep -A 10 < Patrón >

Se trata de agarrar el patrón y los siguientes 10 líneas después el patrón. Esto funcionaría bien solo para un patrón conocido, si no tiene un patrón conocido use las sugerencias de "cabeza".

+1

Aunque podría estar bien. agregue más descripción de la pregunta para que la respuesta sea más completa. –

0

cabeza -10 log.txt | grep -A 2 -B 2 pattern_to_search

cabeza -10 log.txt: lea las primeras 10 líneas del archivo.

-A 2: imprime dos líneas antes del patrón.

-B 2: imprime dos líneas después del patrón.

0

Tuve un problema similar y todos los problemas anteriores no lo resuelven por completo. También estoy interesado en obtener el nombre del archivo que contiene las líneas correspondientes. Mi solución:

ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"' 

N.B: El patrón en mi caso siempre coincide con la primera línea.

1

Una extensión de la respuesta de Joachim Isaksson: muy a menudo necesito algo del medio de un archivo largo, p. Ej. líneas 5001 a 5020, en cuyo caso se pueden combinar con headtail:

head -5020 file.txt | tail -20 | grep x 

esto se pone las primeras 5020 líneas, a continuación, muestra sólo el último de los 20, entonces todo para las tuberías grep.

(Editado: error poste de cerca en mis números de ejemplo, el tubo a grep añadido)

Cuestiones relacionadas