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.

Neil
fuente
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:
love_me_some_linux
fuente
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.

Brightlancer
fuente
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
disidente
fuente
2

Versión Bash

    lineno=$(grep -n "pattern" filename)
    lineno=${lineno%%:*}
disidente
fuente
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
Mark Reed
fuente
0

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

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

Chris
fuente
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:
JstRoRR
fuente
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 '^[^:]+'

Micael Levi
fuente