grep은 모든 행을 필터링하여 각 적중 앞에 하나를 추가합니다.

grep은 모든 행을 필터링하여 각 적중 앞에 하나를 추가합니다.

일부 출력을 구문 분석하고 싶기 때문에 fooor 가 포함된 모든 줄 bar과 해당 줄 바로 앞의 모든 줄을 제외합니다. 예를 들어:

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

나는 출력을 원한다 :

1 some line
6 another line

시도해 보았지만 cat InputFile|grep -v "foo"|grep -v "bar"2행과 4행은 제외되지 않고 -B1이전 행에 대한 옵션도 작동하지 않습니다.

답변1

아마도 awk?

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

답변2

이 시도:

grep -v "$(grep -E -B1 "foo|bar" InputFile)" InputFile

답변3

본질적으로 동일한 것의 더 자세한 버전은 다음과 같습니다.@1_CR위에 게시된 @ash가 다음에 표시됩니다.페이스트빈, 더 읽기 쉬운 구문을 사용하기를 바랍니다.

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

    /foo|bar/ \
    {
        getline currentLine
        next
    }

    NR > 1 \
    {
        print lastLine;
    }

    END \
    {
        if ( currentLine !~ /foo|bar/ )
            print currentLine;
    }
    ' InputFile

관련 정보