91 votes

Comment récupérer uniquement les chiffres dans grep ?

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. J'ai trouvé :

grep [0-9] filename

Mais c'est imprimer l'ensemble :

blah blah blah (:34)

Au contraire, je veux seulement 34 . Y a-t-il un moyen de le faire ?

128voto

devav2 Points 33862

Vous pouvez utiliser grep -E pour accéder à la syntaxe étendue des expressions régulières( Idem que egrep )

J'ai créé un fichier de test avec le contenu suivant :

>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 extraire les chiffres seuls du texte, vous pouvez utiliser

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

seront émis.

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

Les parenthèses ondulées (par exemple { et }) indiquent le nombre d'occurrences de la correspondance. {1,4} signifie que le caractère ou la classe de caractères précédents doivent apparaître au moins une fois, mais pas plus de quatre fois.

J'espère que cela vous aidera

20voto

Sergiy Kolodyazhnyy Points 97292

Vous pouvez utiliser l'expression entre parenthèses RE [:digit:] spécifié par la section 9.3.5 de Norme POSIX en combinaison avec -o drapeau pour imprimer seulement les "mots" correspondants

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

12voto

webgr Points 203

Vous pouvez également utiliser des expressions régulières de style Perl

grep -Po "\\d+" filename

-P Interpréter les PATTERNS comme des expressions régulières compatibles avec Perl (PCRE).

-o Imprimer seulement les parties correspondantes (non vides) d'une ligne correspondante, avec chacune de ces parties sur une ligne de sortie séparée.

7voto

roadmr Points 32606

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

1voto

Stef Points 11

J'utiliserais curl pour accéder à votre fichier localement ou à distance, puis j'irais chercher les lignes contenant des chiffres entourés de ( : ), puis je couperais ces morceaux et les écrirais dans le 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 données de l'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 dans votre dossier actuel seront écrasés, nous accédons à input.txt à partir 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 seront écrasés, nous accédons à input.txt から https://yoursite.com/Public/ .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X