Utilice grep para informar solo los números de línea


105

Tengo un archivo que posiblemente contenga un formato incorrecto (en este caso, la aparición del patrón \\backslash). Me gustaría usar greppara devolver solo los números de línea donde ocurre esto (como en, la coincidencia estaba aquí, vaya a la línea # x y corríjala).

Sin embargo, no parece haber una forma de imprimir el número de línea ( grep -n) y no la coincidencia o la línea en sí.

Puedo usar otra expresión regular para extraer los números de línea, pero quiero asegurarme de que grep no pueda hacerlo por sí solo. grep -nose acerca más, creo, pero aún muestra la coincidencia.


1
La respuesta más útil para mí fue la pregunta grep -no:! ¡Esto hizo lo que vine a intentar y hacer! (es decir, no imprimir la línea que a veces es muy larga en, por ejemplo, archivos fuente de JavaScript minificados).
LondonRob

Respuestas:


156

tratar:

grep -n "text to find" file.ext | cut -f1 -d:

1
En mi máquina, esto solo imprime los archivos coincidentes sin números de línea (por lo que si tengo 3 coincidencias dentro de un archivo, solo se imprime una vez), lo cual es muy útil aún ...
Mario Awad

3
@MarioAwad, debes manipular -fparam. Para mí lo fue -f2. (Sepa que esto es algo viejo, pero creo que podría ayudar a algunas pobres almas)
Emil Sierżęga

gracias por el encantador y antiguo script de shell adhoc de Unix. ¡Esto demuestra que las herramientas flexibles valen su complejidad y curva de aprendizaje!
Alex

12
grep -n "text to find" file.ext | cut -f1,2 -d:muestra el nombre del archivo y el número de línea.
Jondlm

2
@jondim solo muestra el nombre del archivo si se está buscando más de un archivo; debe agregar -Hpara forzar que muestre el nombre del archivo cuando solo hay un archivo. Por el contrario, siempre puede usar -hpara decirle que no muestre el nombre del archivo sin importar cuántos archivos esté grepping.
Mark Reed

45

Si está dispuesto a usar AWK:

awk '/textstring/ {print FNR}' textfile

En este caso, FNR es el número de línea. AWK es una gran herramienta cuando está buscando grep | cut, o en cualquier momento que esté buscando tomar la salida grep y manipularla.


2
Utiliza un proceso (que importaba más en el pasado, pero aún así), ¡y lo suficientemente fácil de entender para principiantes de awk!
bgStack15

NRtambién funciona cuando solo se está examinando un archivo, como en este caso.
Mark Reed

¡Simplemente brillante! ¡Es tan rápido!
GTodorov

34

Todas estas respuestas requieren grep para generar todas las líneas coincidentes y luego canalizarlas a otro programa. Si sus líneas son muy largas, podría ser más eficiente usar solo sed para generar los números de línea:

sed -n '/pattern/=' filename

2

Versión Bash

    lineno=$(grep -n "pattern" filename)
    lineno=${lineno%%:*}

1
¿Y qué sucede si más de una línea coincide con ese patrón?
izabera

@izabera agregar | tail -1
Diego

1

Recomiendo las respuestas con sedy awksolo para obtener el número de línea, en lugar de usar greppara obtener toda la línea coincidente y luego eliminarla de la salida con cutu otra herramienta. Para completar, también puede usar Perl:

perl -nE '/pattern/ && say $.' filename

o Ruby:

ruby -ne 'puts $. if /pattern/' filename

0

Querrá el segundo campo después de los dos puntos, no el primero.

grep -n "text to find" file.txt | cut -f2 -d:


Esto funciona si desea hacer coincidir el texto, pero en el caso de que el número de línea sea lo que pedía el OP.
AJP

0

Para contar el número de líneas que coinciden con el patrón:

grep -n "Pattern" in_file.ext | wc -l 

Para extraer un patrón coincidente

sed -n '/pattern/p' file.est

Para mostrar los números de línea en los que se hizo coincidir el patrón

grep -n "pattern" file.ext | cut -f1 -d:

2
El primero debería ser "grep -c 'Pattern' in_file.ext". El segundo debe ser "grep -o 'Pattern' in_file.ext". No es necesario involucrar sed o wc.
thelogix

0

usando solo grep :

grep -n "text to find" file.ext | grep -Po '^[^:]+'

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.