Come posso recuperare solo numeri in grep?


58

Ho un file come questo:

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

Vorrei trovare la presenza di numeri nel file sopra. Mi è venuta in mente:

grep [0-9] filename

Ma questo sta stampando il tutto:

blah blah blah (:34)

Piuttosto voglio solo 34. C'è un modo per farlo?


In futuro, controlla anche la pagina man per grep (o qualsiasi altro programma). La pagina man descrive in dettaglio le opzioni richieste per molti usi comuni del programma. ad es.man grep
hnasarat,

Puoi provare questo> grep -o '[0-9] [0-9] *' testfile

Risposte:


76

È possibile utilizzare grep -Eper accedere alla sintassi delle espressioni regolari estese (uguale a egrep )

Ho creato un file di test con i seguenti contenuti:

>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)

Ora puoi estrarre i numeri da solo dal testo che puoi usare

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

verrà emesso.

Qui "-o" viene utilizzato solo per generare il segmento corrispondente della linea, anziché l'intero contenuto della linea.

Le parentesi quadre (ad es. {E}) indicano il numero di istanze della corrispondenza. {1,4} richiede che il carattere o la classe di caratteri precedenti debbano essere presenti almeno una volta, ma non più di quattro volte.

Spero che sia di aiuto


3
Bello. Inoltre, per abbinare più di 4 o un numero arbitrario di cifre, utilizzare grep -Eo '[0-9]{1,}' testfile
FractalSpace

9

È possibile utilizzare l'espressione parentesi RE [:digit:]specificata nella sezione 9.3.5 dello standard POSIX , in combinazione con -oflag per stampare solo "parole" corrispondenti

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

5

grep -ostamperà solo la parte corrispondente della linea. Altrimenti grep stamperà tutte le linee con il motivo.


1

Userei l'arricciatura per accedere al tuo file localmente o da remoto, quindi grep linee con i numeri racchiusi in (:) quindi tagliare quei pezzi e scrivere sul file

la risposta accettata ignora che potrebbero esserci dei numeri nelle righe precedenti del file, funziona per i dati di esempio, ma cosa succede se il file era remoto?

Locale

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

In questo esempio output.txtverrà sovrascritto nella cartella corrente, accedendo input.txtdalla cartella pubblica.

A distanza

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

In questo esempio output.txtnella cartella corrente sarà scritto sopra, stiamo accedendo input.txtda https://yoursite.com/Public/.


1
Perché usare curlquando un semplice catfarebbe?
PerlDuck,

La domanda non afferma chiaramente che il file è locale. questa risposta consente entrambi.
Stef
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.