Comment extraire uniquement les nombres dans grep?

45

J'ai un fichier comme celui-ci:

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

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

grep [0-9] filename

Mais cela imprime le tout:

blah blah blah (:34)

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

    
posée Ant's 05.09.2012 - 05:32
la source

4 réponses

53

Vous pouvez utiliser grep -E pour accéder à la syntaxe des expressions régulières étendues (identique à 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, grep les chiffres seuls à partir du texte que vous pouvez utiliser

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

sera affiché.

Ici, "- o" permet d’émettre uniquement le segment correspondant de la ligne, et non le contenu complet de la ligne.

Les crochets (par exemple {et}) indiquent le nombre d'instances de la correspondance. {1,4} exige que la classe de caractères ou de caractères précédente doit apparaître au moins une fois, mais pas plus de quatre fois.

J'espère que ça aide

    
réponse donnée devav2 05.09.2012 - 06:40
la source
7

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

$ grep -o '[[:digit:]]*' <<< $'No number in this line\nbut 123 here'                                                     
123
    
réponse donnée Sergiy Kolodyazhnyy 05.02.2017 - 18:29
la source
5

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

    
réponse donnée roadmr 05.09.2012 - 05:41
la source
0

J'utiliserais curl pour accéder à votre fichier localement ou à distance, puis je placerais des lignes avec des nombres enveloppés dans (:), puis je couperais ces morceaux et j'écrirais dans un fichier

la réponse acceptée ignore qu'il pourrait y avoir des nombres dans les lignes précédentes du fichier, cela fonctionne pour les exemples de données, 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 dans votre dossier actuel sera écrasé, nous accédons à input.txt de votre dossier public.

Remote

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

Dans cet exemple, output.txt dans votre dossier actuel sera écrasé, nous accédons à input.txt depuis https://yoursite.com/Public/ .

    
réponse donnée Stef 28.07.2018 - 14:23
la source

Lire d'autres questions sur les étiquettes