también puede canalizar una secuencia arbitraria a head:someCmd | head -10
Stuart Nelson,
1
El cabezal está predeterminado para imprimir las primeras 10 líneas a la salida estándar, por lo que esto es válido para 10 líneashead log.txt | grep <whatever>
Zlemini
55
¿Hay alguna manera de hacer esto cuando se usa la -lopción de grep ? Me gustaría enumerar todos los archivos que son los primeros 5 caracteres RIFFD.
James M. Lay
49
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
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
Fui una de esas personas que encontró esto en Google. ¡Gracias!
Floris
para mí, este código imprimió la ruta completa del archivo. Que es exactamente lo que necesitaba. También FNR=1solo buscará la primera línea. ¡Gracias!
Brian W
2
Para hacer esto de forma recursiva en un directorio:find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
OrangeDog
1
Gracias @OrangeDog. Una pequeña corrección: debería ser-type f
David Siegal
26
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.
1
@potong tienes razón, corregido. @srikanthradix, aunque puede ser más rápido, su solución no es buscar expresiones regulares sino solo cadenas fijas. awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfilehace.
Zsolt Botykai
44
Además, el estilo no lo es awkish. 2xifsy 1xelseen un comando que no necesita ninguna declaración de acción haría aho. weinberger y kernighan lloran ...
jaypal singh
1
Creo que, en lugar de NR, sería mejor usar FNR, porque si usa awk con varios archivos, FNR comienza desde 0 para cada archivo.
Vladyslav Savchenko
9
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.
Ni siquiera me di cuenta, todas las soluciones headque utilizamos aquí han utilizado -n 10(incluyéndome a mí) sin darme cuenta de que, headpor defecto , solo muestra 10 líneas . :)
No, esto le dará las primeras 6 apariciones de "cadena" en todo el archivo cov.txt
franzisk
2
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)
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".
Aunque podría ser correcto. agregue más descripción de la pregunta para que la respuesta sea más completa.
Pramod S. Nikam
3
Esto responde una pregunta completamente diferente y no es útil en este contexto.
Pre101
-1
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:
head:someCmd | head -10head log.txt | grep <whatever>-lopción de grep ? Me gustaría enumerar todos los archivos que son los primeros 5 caracteresRIFFD.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íaEl
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, usefuente
FNR=1solo buscará la primera línea. ¡Gracias!find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +-type fO use
awkpara un solo proceso sin|: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: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.fuente
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.2xifsy1xelseen 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 usarhead:headgenerará las primeras 10 líneas (usando la-nopción), y luego puede canalizar esa salidagrep.fuente
headque utilizamos aquí han utilizado-n 10(incluyéndome a mí) sin darme cuenta de que,headpor defecto , solo muestra 10 líneas . :)fuente
Puede usar la siguiente línea:
fuente
La salida de
head -10 filese puede canalizargreppara lograr esto:Usando Perl:
fuente
-A 2: imprime dos líneas antes del patrón.-B 2: imprime dos líneas después del patrón.fuente
-C 2-A 2 -B 2Esto busca solo las primeras 6 líneas para
stringfuente
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
headcontail: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)
fuente
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".
fuente
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:
NB: El patrón en mi caso siempre coincide con la primera línea.
fuente