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>
-l
opció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 n
lí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..nextfile
deja 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=1
solo buscará la primera línea. ¡Gracias!
find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
-type f
O use awk
para un solo proceso sin |
:
awk '/your_regexp/ && NR < 11' INPUTFILE
En cada línea, si your_regexp
coincide, 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 ( -n
significa 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; } }' textfile
hace.
awkish
. 2xifs
y 1xelse
en 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 ...
head
generará las primeras 10 líneas (usando la -n
opción), y luego puede canalizar esa salida grep
.
head
que utilizamos aquí han utilizado -n 10
(incluyéndome a mí) sin darme cuenta de que, head
por 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 file
se puede canalizar grep
para 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 head
con 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