Somente string parcial do Grep

0

Eu tenho um arquivo. Este arquivo contém strings como

sdnfasdnbfas;jdfnba;ldjfnb;asdf[MESG: I NEED THIS: 1] adsfasdfasdfasdfasdf
sdnfasdnbfas;jdfnba;ldjfnb;asdf[MESG: I NEED THIS: 2] adsfasdfasdfasdfasdf
sdnfasdnbfas;jdfnba;ldjfnb;asdf[MESG: I NEED THIS: 3] adsfasdfasdfasdfasdf

Como posso usar "grep" para obter uma saída como:

MESG: I NEED THIS: 1
MESG: I NEED THIS: 2
MESG: I NEED THIS: 3
    
por Weiss Willy 11.06.2018 / 23:07

3 respostas

0

leia a regex:

$ echo 'sdnfasdnbfas;jdfnba;ldjfnb;asdf[MESG: I NEED THIS: 1] adsfasdfasdfasdfasdf' | grep -Eo '\[.*\]'
[MESG: I NEED THIS: 1]
$ 
    
por 11.06.2018 / 23:11
0

Obrigado pela ajuda rápida. Infelizmente estou correndo -ash e uma pequena solução foi necessária. Eu corrijo meu problema executando:

grep -o "\w*[MESG: I NEED THIS: 1]\w*" 

Agora eu gostaria de dar algo de volta para a comunidade. Como eu corrijo meu pequeno problema, compartilharei um script genérico para monitorar um determinado arquivo depois de várias strings e agir de acordo.

## This is a generic script to monitor a file for multiple strings and
## act accordingly. 
while true                                                                                                                                      
do                                                                                                                                              
grep -o "\w*[MESG: I NEED THIS: 1]\w*" /don/key | grep '[MESG: I NEED THIS: 1]' &> /dev/null                                                                    
        if [ $? == 0 ];                                                                                                                         
                then                                                                                                                            
                        echo "matched 1"                                                                                                                 
                else                                                                                                                            
                        echo "not matched 1"                                                                                                    
fi                                                                                                                                              
grep -o "\w*[MESG: I NEED THIS: 2]\w*" /don/key | grep '[MESG: I NEED THIS: 2]' &> /dev/null                                                                    
        if [ $? == 0 ];                                                                                                                         
                then                                                                                                                            
                        echo "matched 2"                                                                                                           
                else                                                                                                                            
                        echo "not matched 2"                                                                                                    
fi                                                                                                                                              

grep -o "\w*[MESG: I NEED THIS: 3]\w*" /don/key | grep '[MESG: I NEED THIS: 3]' &> /dev/null                                                                    
        if [ $? == 0 ];                                                                                                                         
                then                                                                                                                            
                 echo "matched 3"                                                                                                                   
                else                                                                                                                            
                 echo "not matched 3"                                                                                                            
fi                                                                                                                                              

sleep 3                                                                                                                                         

done   

Espero que ajude alguém.

    
por 12.06.2018 / 21:42
0

Analisando sua própria resposta a essa pergunta , aqui está uma sugestão:

for number in 1 2 3; do
    string="[MESG: I NEED THIS: $number]"

    if grep -qF "$string" /don/key; then
        printf 'Matched %d\n' "$number"
    else
        printf 'Did not match %d\n' "$number"
    fi
done

Observe que, se você quiser corresponder uma string fixa (não uma expressão regular), use -F with grep . Se você não usa -F , você terá que escapar de quaisquer caracteres especiais em expressões regulares (neste caso, [ e ] ).

O -q impede que grep produza qualquer saída. Não estamos interessados na saída, apenas se corresponder ou não.

A expressão regular [MESG: I NEED THIS: 1] corresponde exatamente a um caractere do conjunto de caracteres dentro do [...] , que não é o que você deseja.

    
por 31.07.2018 / 18:43

Tags