Como grep para um valor depois de um sinal =

2

Como especifico um grep para procurar todos os valores possíveis

ou seja, com um arquivo como (o 9701 poderia ser qualquer valor):

9701=1?? 
9701=10.Pp 
9701=1a 8a 
9701=3.a_tt 
9701=1/a -00
9701=Bg1998pps

Eu poderia tentar

egrep -Eo '9701=[A-Z]+[a-z]+[0-9]{1,50}' test.log

Isso só me dá letras maiúsculas / minúsculas & valores numéricos. Como faço para incluir valores com caracteres especiais na solicitação grep? ou seja, com espaços, pontos, hífens, sublinhados, etc.

    
por DjOlu 14.03.2017 / 12:55

5 respostas

0

Para incluir todos os outros caracteres em seu grep , você pode usar isto:

egrep -Eo '9701=.{1,50}' test.log

O ponto representa QUALQUER personagem.

Mas isso não cortará a parte "9701=" de cada linha. Para conseguir isso você pode usar cut

cut -d "=" -f 2- test.log

Embora isso tropeça se o valor incluir = também.

sed corrigiria isso para você e será a melhor solução para o seu problema:

sed -r 's/^9701=(.*)$//' test.log

ou

sed 's/^9701=\(.*\)$//' test.log

ou até mesmo

sed 's/^9701=//' test.log
    
por 14.03.2017 / 13:11
1

com pcregrep :

pcregrep -o1 '9701=(.*)'

Imprimiria o que está à direita da ocorrência mais à esquerda de 9701= em uma linha (para as linhas que contêm 9701 =).

Com o GNU grep construído com um PCRE recente:

grep -Po '9701=\K.*'

Embora isso não relate uma linha vazia para uma entrada como 9701= (é aí que o que está depois de 9701= é a string vazia).

Normalmente, isso seria um trabalho para sed :

sed -n 's/9701=/\
/;s/.*\n//p'
    
por 14.03.2017 / 13:21
0
cut -d '=' -f 2-  data.in

Isso tratará cada linha como um número de campos = -delimited e retornará tudo após o primeiro campo

Saída:

1??
10.Pp
1a 8a
3.a_tt
1/a -00
Bg1998pps

Se você precisa ter certeza de apenas retornar itens relacionados à parte inicial da linha ( 9701 no seu caso):

grep '^9701=' data.in | cut -d '=' -f 2-

Como alternativa, a coisa toda com awk (embora isso falhe se houver mais de um = em uma linha):

awk -F '=' '/^9701/ { print $2 }' data.in
    
por 14.03.2017 / 13:10
0

Tente grep tudo, isso não é = :

# echo '9701=1?? 
9701=10.Pp 
9701=1a 8a 
9701=3.a_tt 
9701=1/a -00
9701=Bg1998pps' | egrep -o '9701=[^=]{1,50}'
9701=1?? 
9701=10.Pp 
9701=1a 8a 
9701=3.a_tt 
9701=1/a -00
9701=Bg1998pps
# echo '9701=Bg19=98pps' | egrep -o '9701=[^=]{1,50}'
9701=Bg19
## If you too need to include equal char
# echo '9701=Bg19= 98pps' | egrep -o '9701=.{1,50}'
9701=Bg19= 98pps
    
por 14.03.2017 / 13:07
0

grep no modo Perl-regex com lookbehind :

grep -oP '=\K.+'
    
por 14.03.2017 / 13:48