grep filtra todas as linhas mais uma antes de cada hit

3

Eu quero analisar alguma saída para excluir todas as linhas que contêm foo ou bar , bem como todas as linhas imediatamente anteriores a essas linhas. Por exemplo:

echo "
1 some line
2 line to exclude because the next line has one of the terms
3 line with foo
4 line to exclude because the next line has one of the terms too
5 line with bar
6 another line
">InputFile

Eu quero a saída:

1 some line
6 another line

Eu tentei cat InputFile|grep -v "foo"|grep -v "bar" , mas isso não exclui as linhas 2 e 4, e a opção -B1 para a linha anterior também não funciona.

    
por rubo77 29.08.2013 / 15:13

3 respostas

0

Aqui está a versão mais detalhada de essencialmente a mesma coisa @ 1_CR postada acima e @ ash mostrada em pastebin , esperamos usar uma sintaxe mais legível:

awk '{
        lastLine = currentLine;
        currentLine = $0;
    }

    /foo|bar/ \
    {
        getline currentLine
        next
    }

    NR > 1 \
    {
        print lastLine;
    }

    END \
    {
        if ( currentLine !~ /foo|bar/ )
            print currentLine;
    }
    ' InputFile
    
por 08.10.2014 / 20:23
5

Talvez awk ?

awk 'BEGIN{a = "foo"}; a !~ /foo|bar/ && $0 !~ /foo|bar/{print a};
{a = $0};END{if(a !~ /foo|bar/){print a}}' InputFile
    
por 29.08.2013 / 16:45
4

Tente isto:

grep -v "$(grep -E -B1 "foo|bar" InputFile)" InputFile
    
por 29.08.2013 / 15:37