¿Cómo obtengo solo números en grep?

58

Tengo un archivo como este:

 other lines . . .    
 blah blah blah (:34)

Deseo encontrar la aparición de números en el archivo anterior. Se me ocurrio:

grep [0-9] filename

Pero eso es imprimir todo:

blah blah blah (:34)

Más bien solo quiero 34. ¿Hay alguna manera de hacerlo?

Hormiga
fuente
En el futuro, también consulte la página de manual de grep (o cualquier otro programa). La página del manual detalla las opciones requeridas para muchos usos comunes del programa. egman grep
hnasarat
Puede probar esto> grep -o '[0-9] [0-9] *' testfile

Respuestas:

76

Puede usar grep -Epara acceder a la sintaxis de expresión regular extendida (igual que egrep )

He creado un archivo de prueba con los siguientes contenidos:

>cat testfile
this is some text
with some random lines

again some text
ok now going for numbers (:32)
ok now going for numbers (:12)
ok now going for numbers (:132)
ok now going for numbers (:1324)

Ahora para grep solo los números del texto que puede usar

>grep -Eo '[0-9]{1,4}' testfile
32
12
132
1324

Se dará salida.

Aquí "-o" se usa para generar solo el segmento correspondiente de la línea, en lugar del contenido completo de la línea.

Los corchetes (p. Ej., {Y}) indican el número de instancias del partido. {1,4} requiere que el carácter o la clase de carácter anterior debe aparecer al menos una vez, pero no más de cuatro veces.

Espero que esto ayude

devav2
fuente
3
Agradable. Además, para hacer coincidir más de 4 o un número arbitrario de dígitos, use grep -Eo '[0-9]{1,}' testfile
FractalSpace
9

Puede usar la expresión de paréntesis RE [:digit:]especificada en la sección 9.3.5 del estándar POSIX , en combinación con la -omarca para imprimir solo "palabras" coincidentes

$ grep -o '[[:digit:]]*' <<< $'No number in this line\nbut 123 here'                                                     
123
Sergiy Kolodyazhnyy
fuente
5

grep -oimprimirá solo la parte correspondiente de la línea. De lo contrario, grep imprimirá cualquier línea con el patrón.

roadmr
fuente
1

Usaría curl para acceder a su archivo de forma local o remota, luego buscaría líneas con números envueltos en (:) y luego cortaría esas piezas y escribiría en el archivo

la respuesta aceptada ignora que podría haber números en las líneas anteriores del archivo, funciona para los datos de ejemplo, pero ¿y si el archivo fuera remoto?

Local

curl file:///home/$USER/Public/input.txt  | grep -o '(:.*)' | cut -d ":" -f 2 | cut -d ")" -f 1 > output.txt

En este ejemplo, output.txten su carpeta actual se sobrescribirá, estamos accediendo input.txtdesde su carpeta Pública.

Remoto

curl https://yoursite.com/Public/input.txt  | grep -o '(:.*)' | cut -d ":" -f 2 | cut -d ")" -f 1 > output.txt

En este ejemplo output.txten su carpeta actual se sobrescribirá, estamos accediendo input.txtdesde https://yoursite.com/Public/.

Stef
fuente
1
¿Por qué usar curlcuando un simple catlo haría?
PerlDuck
La pregunta no indica claramente que el archivo es local. Esta respuesta permite ambos.
Stef