web-dev-qa-db-fra.com

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

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)

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

53
Ant's

Vous pouvez utiliser grep -E pour 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 ({et}, par exemple) indiquent le nombre d'instances 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

69
devav2

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

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

grep -o n'imprimera que la partie correspondante de la ligne. Sinon, grep imprimera toutes les lignes avec le motif.

5
roadmr

J'utiliserais curl pour accéder à votre fichier localement ou à distance, puis je ferais un grep avec des lignes entourées de nombres entre (:), puis couperais ces morceaux et écrirais 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.txt de votre dossier actuel sera remplacé, nous allons accéder à input.txt à partir de votre dossier Public.

à distance

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

Dans cet exemple, output.txt de votre dossier actuel sera remplacé, nous allons accéder à input.txt à partir de https://yoursite.com/Public/.

0
Stef