Filtrar linhas se o número de ocorrências de string for encontrado?

1

Precisa filtrar e mostrar linhas de log, se a linha contiver exatamente 2 vírgulas e não contiver uma string específica. Qual comando do linux eu preciso usar, awk , grep , qual é a expressão?

Para segunda condição eu uso isso:

awk '!/specificstring/' ./log/file/path

Duas checagens de vírgulas eu não sei como colocar. Normalmente, a linha é assim:

arbitrary,arbitrary,arbitrary,arbitrary
arbitrary,arbitrary,arbitrary

Precisa do segundo tipo de linha.

Tentei algo assim:

grep -P '[^,]+[,][^,]+[,][^,]+[,]"specificstring"[^,]+' ./log/file/path

Como excluir "specificstring"?

    
por János 17.09.2017 / 15:47

2 respostas

2

Sugiro:

grep '^[^,]*,[^,]*,[^,]*$' file | grep -v 'specificstring'
    
por 17.09.2017 / 18:33
0

Isso pode ser feito em uma passagem com awk , combinando as duas condições:

awk '/^[^,]*,[^,]*,[^,]*$/ && !/specificstring/' ./log/file/path

O mesmo pode ser alcançado em perl com um comando quase idêntico:

perl -lane 'print if /^[^,]*,[^,]*,[^,]*$/ && !/specificstring/' ./log/file/path

Para responder à pergunta em seu sentido mais genérico, ou seja, filtra linhas se um número arbitrário de ocorrências de string for encontrado :

perl -lane '@m = /,/g; print if scalar @m == 2 and !/specificstring/' ./log/file/path
    
por 18.09.2017 / 15:37