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?


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


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

5

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


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/.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.