Grep para um intervalo de números entre parênteses

4

Eu estou tentando grep apenas para um intervalo de números localizados dentro de parênteses. Meu grep atual vai puxar tudo dentro dos parênteses, mas eu só quero qualquer coisa de [0001-9999] . Como posso consertar meu grep para fazer isso?

Eu tentei algumas versões diferentes desse (?<=\()[0001-9999](?=\)) , mas elas não retornam nada

$ cat /tmp/output
This is R3trans version 6.26 (release 745 - 24.03.17 - 20:17:03).
R3trans finished (0000).
R3trans finished (0001).
R3trans finished (9999).
05.03.2018 16:30:02
enserver, EnqueueServer, RED, Running, 2018 02 27 09:15:52, 151:14:10, 19069

Saída atual

$ cat /tmp/output | grep -Po '(?<=\().*(?=\))'
release 745 - 24.03.17 - 20:17:03
0000
0001
9999

Saída desejada

$ cat /tmp/output | grep -Po '(?<=\().*(?=\))'
0001
9999
    
por SpruceTips 06.03.2018 / 18:27

3 respostas

8

Duas abordagens para alcançar o objetivo:

grep abordagem (com Perl suporte):

grep -Po '\(\K(?!0000)([0-9]{4})(?=\))' /tmp/output

Abordagem do awk do GNU:

awk -v FPAT='\([0-9]{4}\)' '$1{ n = substr($1,2,4); if (int(n) > 0) print n }' /tmp/output

A saída:

0001
9999
    
por 06.03.2018 / 18:38
3

Aparentemente, você tem restrições numéricas. Se este for o caso, por que não usar uma linguagem de programação? Exemplo:

perl -nE '/\((\d{4})\)/ and $1 > 0 and say $1'
    
por 06.03.2018 / 18:39
3

Isso parece funcionar:

grep -Eo '[0-9]{4}' /path/to/file | grep -v '0000'

Menos legível, mas com apenas um grep :

grep -Eo '[0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]|[0-9][1-9][0-9]{2}|[1-9][0-9]{3}' /path/to/file
    
por 06.03.2018 / 18:30