Regex que iria grep números depois de uma string específica

8

Então eu tenho uma linha:

ID: 54376

Você pode me ajudar a fazer um regex que retorne números sem "ID:"?

OBSERVAÇÃO: esta string está em um arquivo.

    
por Blake Gibbs 24.05.2014 / 10:16

7 respostas

14

Tente isto:

grep -oP '(?<=ID: )[0-9]+' file

ou:

perl -nle 'print $1 if /ID:.*?(\d+)/' file
    
por 24.05.2014 / 10:21
5

Existem muitas maneiras de fazer isso. Por exemplo:

  1. Use o GNU grep com PCREs recentes e combine os números depois de ID: :

    grep -oP 'ID:\s*\K\d+' file
    
  2. Use awk e simplesmente imprima o último campo de todas as linhas que começam com ID:

    awk '/^ID:/{print $NF}' file
    

    Isso também imprimirá campos que não são números, para obter apenas números e somente no segundo campo, use

    awk '($1=="ID:" && $2~/^[0-9]+$/){print $2}' file
    
  3. Use o GNU grep com expressões regulares estendidas e analise-o duas vezes:

    grep -Eo '^ID: *[0-9]+' file | grep -o '[0-9]*'
    
por 24.05.2014 / 14:00
5
sed -n '/ID: 54376/,${s/[^ 0-9]*//g;/./p}'

Isso imprimirá somente todos os números e espaços que ocorrerem após ID: 54376 em qualquer entrada de arquivo.

Acabei de atualizar um pouco o texto acima para torná-lo um pouco mais rápido com * e não para p rint linhas em branco após remover os caracteres não {numéricos, de espaço}.

Ele direciona linhas de regex /ID: 54376/ , até $ e, nelas, s/// remove todos ou nenhum * caracteres ^ não [^ 0-9]* , em seguida p rints / any / linha com um caractere . restante.

DEMO:

{
echo line 
printf 'ID: 54376\nno_nums_or_spaces\n'
printf '%s @nd 0th3r char@cter$ %s\n' $(seq 10)
echo 'ID: 54376'
} | sed -n '/ID 54376/,${s/[^ 0-9]*//g;/./p}'

OUTPUT:

 54376
1  03  2
3  03  4
5  03  6
7  03  8
9  03  10
 54376
    
por 24.05.2014 / 10:23
3

Use a opção egrep com -o ou grep com -Eo para obter apenas o segmento correspondente. Use [0-9] como regex para obter apenas números:

grep -Eo [0-9]+ filename
    
por 24.05.2014 / 10:20
1

Usando sed:

{
    echo "ID: 1"
    echo "Line doesn't start with ID: "
    echo "ID: Non-numbers"
    echo "ID: 4"
} | sed -n '/^ID: [0-9][0-9]*$/s/ID: //p'

O -n é "não imprime nada por padrão", o /^ID: [0-9][0-9]*$/ é "para linhas que correspondem a esta regex" (começa com "ID:", depois 1 ou mais dígitos, depois fim de linha), e o s/ID: //p está no formato s/pattern/repl/flags - s significa que estamos fazendo um substituto para substituir o padrão "ID: " pelo texto de substituição "" (sequência vazia) usando o p flag, o que significa "imprima esta linha depois de fazer a substituição".

Saída:

1
4
    
por 25.05.2014 / 18:33
0

Outro comando do GNU sed,

sed -nr '/ID: [0-9]+/ s/.*ID: +([0-9]+).*//p' file

Imprime qualquer número após ID:

    
por 24.05.2014 / 17:47
0

Use grep + awk:

  grep "^ID" your_file | awk {'print $2'}

Bônus: fácil de ler:)

    
por 12.05.2016 / 14:37