Como obtenho apenas números no grep?

58

Eu tenho um arquivo como este:

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

Desejo encontrar a ocorrência de números no arquivo acima. Eu vim com:

grep [0-9] filename

Mas isso está imprimindo o todo:

blah blah blah (:34)

Pelo contrário, eu quero apenas 34. Existe alguma maneira de fazer isso?

Formigas
fonte
No futuro, verifique também a página de manual do grep (ou qualquer outro programa). A página de manual detalha as opções necessárias para muitos usos comuns do programa. por exemploman grep
hnasarat 5/09/12
Você pode tentar isso> grep -o '[0-9] [0-9] *' testfile

Respostas:

76

Você pode usar grep -Epara acessar a sintaxe da expressão regular estendida (o mesmo que egrep )

Eu criei um arquivo de teste com o conteúdo abaixo:

>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)

Agora, para saudar os números sozinho do texto, você pode usar

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

será produzido.

Aqui "-o" é usado para gerar apenas o segmento correspondente da linha, em vez do conteúdo completo da linha.

Os colchetes irregulares (por exemplo, {e}) indicam o número de instâncias da correspondência. {1,4} requer que o caractere ou classe de caracteres anterior ocorra pelo menos uma vez, mas não mais que quatro vezes.

Espero que isto ajude

devav2
fonte
3
Agradável. Além disso, para corresponder a mais de 4 ou arbitrária número de dígitos, use grep -Eo '[0-9]{1,}' testfile
FractalSpace
9

Você pode usar a expressão de colchete RE [:digit:]especificada na seção 9.3.5 do padrão POSIX , em combinação com o -osinalizador para imprimir apenas "palavras" correspondentes

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

grep -oimprimirá apenas a parte correspondente da linha. Caso contrário, o grep imprimirá todas as linhas com o padrão.

roadmr
fonte
1

Eu usaria o curl para acessar seu arquivo local ou remotamente, em seguida, preencheria as linhas com números envoltos em (:), cortaria esses pedaços e gravaria no arquivo

a resposta aceita ignora que possa haver números nas linhas anteriores do arquivo, funciona para os dados de exemplo, mas e se o arquivo fosse remoto?

Local

curl file:///home/$USER/Public/input.txt  | grep -o '(:.*)' | cut -d ":" -f 2 | cut -d ")" -f 1 > output.txt

Neste exemplo output.txt, sua pasta atual será gravada, estamos acessando a input.txtpartir da sua pasta Pública.

Controlo remoto

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

Neste exemplo output.txtna sua pasta atual será escrito mais, estamos acessando input.txta partir https://yoursite.com/Public/.

Stef
fonte
1
Por que usar curlquando um simples catfaria?
PerlDuck
A questão não indica claramente que o arquivo é local. esta resposta permite ambos.
28518 Stef Stef