Numéros de téléphone Grep pouvant être formatés de différentes manières

J’ai un fichier avec des lignes et certaines des lignes incluent des numéros de téléphone, qui ont tous 10 numéros, mais sont formatés différemment les uns des autres. Exemples:

00 00 00 00 00 00.00.00.00.00 00000-00000 0-0000-00000 (000)000-0000 

Je dois trouver uniquement les lignes avec des numéros de téléphone et les imprimer. Pour être encore plus déroutant, il existe des lignes avec des adresses IP qui ne doivent pas être imprimées 🙁 Comment puis-je faire cela?

 egrep '([0-9].*){10}' file.txt | egrep -v '(^|[ \t])[0-9]{1,3}(\.[0-9]{1,3}){3}([ \t]|$)' 

La première regex recherche les lignes comportant 10 chiffres, en ignorant tous les autres caractères. La deuxième regex filtre les adresses IP. Ces deux expressions sont grossières, mais l’idée de base est là. Ajustez-les au besoin.

(Le premier, par exemple, autorisera tous les caractères entre les chiffres; vous pouvez autoriser uniquement certains symboles et espaces. Le second filtrera les éléments qui ressemblent à des adresses IP mais ne sont pas valides, comme 300.400.50.60 .)

Cet exemple n’imprimera que la partie correspondante de chaque ligne contenant un numéro de téléphone. Il traite les performances pour la lisibilité car il parcourt tous les filtres pour chaque ligne:

 #!/bin/bash while read line do while read filter do egrep -o "$filter" <<<"$line" done < 

Cet exemple sera toujours très lisible, mais ne montre pas les défauts de performance du premier:

 FILTERS=" ([0-9]{2}[ \.]){4}[0-9]{2} [0-9]{5}-[0-9]{5} [0-9]-[0-9]{4}-[0-9]{5} [\(][0-9]{3}[\)][0-9]{3}-[0-9]{4} " # replace newlines with '|', FILTERS=$( tr " " "|" <<<"$FILTERS" ) # surround result with '(' and ')': FILTERS="(""$FILTERS"")" while read line do egrep -o "$FILTERS" <<<"$line" done < "$1" 

Avec le bon module perl – Numéros de téléphone américains uniquement:

 perl -MNumber::Phone -nlE 'say $_ if Number::Phone->new('US', $_)' 

À partir de l’entrée suivante

 00 00 00 00 00 00.00.00.00.00 00000-00000 0-0000-00000 (000)000-0000 (320)234-4565 32023-44565 12042345678 2042345678 1(201)2345678 201-23-45-678 +421-934-4354 1 242 555 0199 1 246 555 0199 1 264 555 0199 1 268 555 0199 1 284 555 0199 1 340 555 0199 1 345 555 0199 1 441 555 0199 1 473 555 0199 1 649 555 0199 +441234567890 

estampes

 (320)234-4565 32023-44565 2042345678 201-23-45-678 

Le code suivant:

 perl -MNumber::Phone::Country -nlE 'say "$_:\t",phone2country($_)' 

estampes:

 00 00 00 00 00: NANP 00.00.00.00.00: NANP 00000-00000: NANP 0-0000-00000: NANP (000)000-0000: NANP (320)234-4565: US 32023-44565: US 12042345678: CA 2042345678: CA 1(201)2345678: US 201-23-45-678: US +421-934-4354: SK 1 242 555 0199: BS 1 246 555 0199: BB 1 264 555 0199: AI 1 268 555 0199: AG 1 284 555 0199: VG 1 340 555 0199: VI 1 345 555 0199: KY 1 441 555 0199: BM 1 473 555 0199: GD 1 649 555 0199: TC +441234567890: GB