Comment puis-je récupérer uniquement des nombres dans grep?

58

J'ai un fichier comme ça:

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

Je souhaite trouver l'occurrence de nombres dans le fichier ci-dessus. Je suis venu avec:

grep [0-9] filename

Mais c'est imprimer le tout:

blah blah blah (:34)

Plutôt je veux seulement 34. Y a-t-il un moyen de le faire?

Fourmis
la source
À l'avenir, consultez également la page de manuel de grep (ou de tout autre programme). La page de manuel détaille les options requises pour de nombreuses utilisations courantes du programme. par exempleman grep
hnasarat
Vous pouvez essayer ceci> grep -o '[0-9] [0-9] *' testfile

Réponses:

76

Vous pouvez utiliser grep -Epour accéder à la syntaxe d'expression régulière étendue ( idem egrep )

J'ai créé un fichier de test avec le contenu ci-dessous:

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

Maintenant, pour écrire seulement les nombres du texte que vous pouvez utiliser

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

sera sortie.

Ici, "-o" est utilisé pour sortir uniquement le segment correspondant de la ligne, plutôt que le contenu complet de la ligne.

Les crochets (par exemple {et}) indiquent le nombre d’occurrences de la correspondance. {1,4} exige que le caractère ou la classe de caractères précédent apparaisse au moins une fois, mais pas plus de quatre fois.

J'espère que cela t'aides

devav2
la source
3
Agréable. De plus, pour faire correspondre plus de 4 chiffres ou un nombre arbitraire de chiffres, utilisez grep -Eo '[0-9]{1,}' testfile
FractalSpace
9

Vous pouvez utiliser l'expression de parenthèse RE [:digit:]spécifiée à la section 9.3.5 de la norme POSIX , en combinaison avec -oflag pour n'imprimer que les "mots" correspondants.

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

grep -on’imprimera que la partie correspondante de la ligne. Sinon, grep imprimera toutes les lignes avec le motif.

roadmr
la source
1

Je voudrais utiliser curl pour accéder à votre fichier localement ou à distance, puis je voudrais grep lignes avec des nombres enveloppés dans (:), puis couper ces morceaux et écrire dans le fichier

la réponse acceptée ignore qu'il pourrait y avoir des numéros dans les lignes précédentes du fichier, cela fonctionne pour les données d'exemple, mais que se passe-t-il si le fichier est distant?

Local

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

Dans cet exemple, output.txtvotre dossier actuel sera remplacé, nous y accéderons input.txtdepuis votre dossier public.

Éloigné

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

Dans cet exemple, output.txtvotre dossier actuel sera écrasé, nous y accédons input.txtdepuis https://yoursite.com/Public/.

Stef
la source
1
Pourquoi utiliser curlquand un simple catferait l'affaire?
PerlDuck
La question n'indique pas clairement que le fichier est local. cette réponse permet les deux.
Stef