grep을 실행하고 일치 전후에 x 줄 수를 표시하는 방법

grep을 실행하고 일치 전후에 x 줄 수를 표시하는 방법

grep정규식과 일치하는 줄만 반환됩니다. 일반적으로 제가 실제로 보고 싶은 것은 일치하는 줄 위와 아래의 몇 줄입니다(예: 2줄). 이를 달성하는 간단한 방법이 있습니까?

편집자: 운영 체제: Ubuntu 기반 Bodhi Linux. 댓글에서 언급했듯이 -C는 일반 버전에서는 작동하지 않지만 제 경우에는 GNU grep이었습니다.

답변1

에서 man grep:

컨텍스트 라인 제어

-A NUM, --after-context=NUM

줄을 일치시킨 후 NUM 줄 후행 컨텍스트를 인쇄합니다. 연속적으로 일치하는 그룹 사이에 그룹 구분 기호(--)가 포함된 줄을 배치합니다. -o 또는 --only-matching 옵션을 사용하면 효과가 없으며 경고가 표시됩니다.

-B NUM, --before-context=NUM

행을 일치시키기 전에 NUM행 선행 컨텍스트를 인쇄합니다. 연속적으로 일치하는 그룹 사이에 그룹 구분 기호(--)가 포함된 줄을 배치합니다. -o 또는 --only-matching 옵션을 사용하면 효과가 없으며 경고가 표시됩니다.

-C NUM, -NUM, --context=NUM

NUM줄의 출력 컨텍스트를 인쇄합니다. 연속적으로 일치하는 그룹 사이에 그룹 구분 기호(--)가 포함된 줄을 배치합니다. -o 또는 --only-matching 옵션을 사용하면 효과가 없으며 경고가 표시됩니다.

그게 얼마나 쉬운지 보세요? man당신의 친구입니다.

답변2

사용(휴대용):

awk '
    {
        arr[NR]=$0
    }
    END{
        for (i=0;i<=NR;i++) {
            if (arr[i] ~ grep){
                for (j=i-count; j<=i+count; j++) {
                    print arr[j]
                }
            }
        }
    }
' grep=kdm count=4 /etc/passwd

게임 전/후에 4줄로 사용자를 kdm파악 합니다./etc/passwd

안에스크립트:

#!/bin/sh

awk '
    {
        arr[NR]=$0
    }
    END{
        for (i=0;i<=NR;i++) {
            if (arr[i] ~ grep){
                for (j=i-count; j<=i+count; j++) {
                    print arr[j]
                }
            }
        }
    }
' grep="$1" count="$2" "$3"

용법:

./contextgrep <pattern> <count> <file> 

관련 정보