Tengo archivos de registro muy largos, ¿es posible pedirle a grep que solo busque las primeras 10 líneas?
Tengo archivos de registro muy largos, ¿es posible pedirle a grep que solo busque las primeras 10 líneas?
Respuestas:
La magia de las pipas;
head -10 log.txt | grep <whatever>
head log.txt | grep <whatever>
-lopción de grep ? Me gustaría enumerar todos los archivos que son los primeros 5 caracteres RIFFD.
Para las personas que encuentran esto en Google, necesitaba buscar las primeras nlíneas de varios archivos, pero solo imprimir los nombres de archivo coincidentes. solía
gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames
El FNR..nextfiledeja de procesar un archivo una vez que se han visto 10 líneas. Los //..{}grabados el nombre de archivo y se mueve sobre cada vez que el primer partido en una determinada muestra de archivo de hasta. Para citar los nombres de archivo en beneficio de otros programas, use
gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames
FNR=1solo buscará la primera línea. ¡Gracias!
find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
-type f
O use awkpara un solo proceso sin |:
awk '/your_regexp/ && NR < 11' INPUTFILE
En cada línea, si your_regexpcoincide, y el número de registros (líneas) es inferior a 11, ejecuta la acción predeterminada (que es imprimir la línea de entrada).
O use sed:
sed -n '/your_regexp/p;10q' INPUTFILE
Comprueba su expresión regular e imprime la línea ( -nsignifica que no imprime la entrada, que de lo contrario es la predeterminada), y se cierra justo después de la décima línea.
awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile-- Más rápido.
awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfilehace.
awkish. 2xifsy 1xelseen un comando que no necesita ninguna declaración de acción haría aho. weinberger y kernighan lloran ...
Tienes algunas opciones para usar programas junto con grep. Lo más simple en mi opinión es usar head:
head -n10 filename | grep ...
headgenerará las primeras 10 líneas (usando la -nopción), y luego puede canalizar esa salida grep.
headque utilizamos aquí han utilizado -n 10 (incluyéndome a mí) sin darme cuenta de que, headpor defecto , solo muestra 10 líneas . :)
grep "pattern" <(head -n 10 filename)
Puede usar la siguiente línea:
head -n 10 /path/to/file | grep [...]
La salida de head -10 filese puede canalizar greppara lograr esto:
head -10 file | grep …
Usando Perl:
perl -ne 'last if $. > 10; print if /pattern/' file
grep -m6 "string" cov.txt
Esto busca solo las primeras 6 líneas para string
Una extensión de la respuesta de Joachim Isaksson: Muy a menudo necesito algo del medio de un archivo largo, por ejemplo, las líneas 5001 a 5020, en cuyo caso se puede combinar headcon tail:
head -5020 file.txt | tail -20 | grep x
Esto obtiene las primeras 5020 líneas, luego muestra solo las últimas 20 de esas, luego canaliza todo a grep.
(Editado: error de poste de la cerca en mis números de ejemplo, tubería agregada a grep)
grep -A 10 <Patrón>
Esto es para tomar el patrón y las siguientes 10 líneas después del patrón. Esto funcionaría bien solo para un patrón conocido, si no tiene un patrón conocido use las sugerencias de "cabeza".
Tuve un problema similar y todo el problema anterior no lo resuelve por completo. También estoy interesado en obtener el nombre del archivo que contiene las líneas coincidentes. Mi solución:
ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'
NB: El patrón en mi caso siempre coincide con la primera línea.
head:someCmd | head -10