파일을 grep하지만 몇 줄의 주변 줄을 표시 하시겠습니까?


3417

grep문자열을 원하지만 앞의 다섯 줄과 다음 다섯 줄뿐만 아니라 일치하는 줄도 표시하고 싶습니다 . 이 작업을 어떻게 수행 할 수 있습니까?


3
이 목적을 위해 Brendan Gregg의 펄 스크립트 사본을 보관합니다 . 잘 작동합니다.
Ethan Post

6
Solaris에서 작동하는 솔루션에 대해서는 이 링크를 확인 하십시오 .
jahroy

106
man grep | grep -C 1 context:)
StvnW

20
man grep | grep -C 1 "\-C";)
Anders B

9
@StvnW ... 나는 그 메타 (SO 컨텍스트보다 일반적인)를 호출할지 또는 무엇을 호출 해야할지 모르겠습니다 . 답변을 사용하여 답변을 찾는 방법을 보여 주면서 질문에 답변했습니다.
bballdave025

답변:


4535

들어 BSDGNU grep 당신이 사용할 수있는 -B num경기 전에 얼마나 많은 라인을 설정 -A num경기 후 라인의 수.

grep -B 3 -A 2 foo README.txt

이전과 이후에 같은 수의 행을 원하면을 사용할 수 있습니다 -C num.

grep -C 3 foo README.txt

3 줄 앞과 뒤에 3 줄이 표시됩니다.


56
좋지만 불행히도 Solaris grep은이를 지원하지 않습니다. solaris 관련 링크 참조 : unix.com/solaris/33533-grep-display-few-lines-before-after.html
рüффп

9
좋아, 그러나 일치 후에 모든 출력 라인 을 표시하려면 어떻게해야 합니까? grep -A0와 grep -A-1은 자르지 않습니다 ...
g33kz0r

2
맨 페이지에 언급되어 있지만 어떤 이유로 든 나를 위해 작동하지 않습니다.
Hayri Uğur Koltuk

2
HP-UX env 인 경우 grep 버전이 Solaris에서 작동하지 않습니다. Solaris 링크를 사용할 수 있었지만 해당 링크에서 nawk를 awk로 대체했습니다.
zkarthik

6
-n은 줄 번호를위한 것이지만, 일부 grep 버전의 경우 -n #은 줄 번호와 함께 -c와 같은 주변 줄을 # 표시합니다. 컨텍스트가 필요할 때 유용한 바로 가기입니다.
Anthony DiSanti

607

-A원하는 -B대로 -C n( n컨텍스트 라인) 또는 그냥 -n( n컨텍스트 라인 ... n이 1 ~ 9 인 한) 작동합니다.


나는 -n형식을 시도하고 까지만 작동한다는 것을 알았습니다 9. 들어 15는 5 개 라인 반환
디팍 Mahakale을

7
@DeepakMahakale 이것은 아마도 POSIX 프로그램이 명령 행 인수 / 옵션을 분석하는 방법과 관련이있을 것입니다. 옵션 지정자는 단일 문자 (예이다 -A, -B또는 -C). 일반적으로 옵션 지정자 뒤에 값 ( -o a.outGCC에 출력 파일을 지정하기 위해)이 있지만, 간단한 스위치 / 플래그 ( -gGCC에서 디버깅 정보를 활성화하기 위해) 로 기능 할 수도 있습니다 . 그러나 옵션 사이의 공백은 선택 사항이므로 값이없는 옵션의 경우 병합 할 수 있습니다 ( -ABC). 이는 -15해석되고 -1 -5(두 개의 개별 옵션) -5재정의 됨을 의미 합니다 -1.
natiiix

1
-5는 -A 5 -B 5보다 빠릅니다. 이들을 함께 사용해서는 안됩니다. -9보다 -A 또는 -B 또는 -C를 선택하면 스크립트의 다른 독자에게 더 깨끗합니다.
Eric Aldinger 2016 년

76

ack 는 grep과 비슷한 인수로 작동하며 받아들 -C입니다. 그러나 일반적으로 코드를 검색하는 것이 좋습니다.


5
ack는 -A -B도 지원합니다.
Shuo

Ack는 여러 가지면에서 grep보다 낫습니다. 더 간단한 구문으로 더 빠릅니다.
chim

1
grep은 많은 시스템에 기본적으로 설치되는 이점이 있습니다.
Marc Z

1
@MarcZ : 사실, grep은 기본적으로 ack보다 설치 될 가능성이 높지만 ack는 이식 가능한 독립형 스크립트입니다. 컴파일하거나 / usr / bin /과 같은 시스템 디렉토리에 설치할 필요가 없습니다. 다운로드되고 $ PATH (및 해당 eXecute 권한 비트 세트)에 나열된 디렉토리에 배치되면 바로 작동합니다. (ack가 작동하기 위해 sudo 나 root 권한이 필요하지 않습니다.)
JL

이 질문은 grep"광고" ack(실제로 훌륭한 도구 임)에 그것을 사용하지 않는 것이 좋은 생각입니다…
MonsieurDart

39
grep astring myfile -A 5 -B 5

"astring"에 대해 "myfile"을 grep하고 각 일치 전후 5 줄을 표시합니다.


19
"grep astring myfile -C 5"도 마찬가지입니다.
Syed Siraj Uddin

20

나는 보통

grep searchstring file -C n # n for number of lines of context up and down

grep과 같은 많은 도구에는 실제로 훌륭한 man 파일도 있습니다. 나는 당신이 할 수있는 일이 너무 많기 때문에 grep의 맨 페이지 를 많이 언급하고 있습니다.

man grep

많은 GNU 도구 에는 매뉴얼 페이지 외에 더 유용한 정보 가있는 정보 페이지 가 있습니다.

info grep

13

grep 사용

$ grep --help | grep -i context
Context control:
  -B, --before-context=NUM  print NUM lines of leading context
  -A, --after-context=NUM   print NUM lines of trailing context
  -C, --context=NUM         print NUM lines of output context
  -NUM                      same as --context=NUM

수락 된 답변을 읽지 않았습니까? 당신은 거의 10 살짜리 질문에 대해 이미 말한 것을 반복하고 있습니다.
Yokai

7
아 죄송합니다. 요 카이. 그러나 grep의 도움말 섹션을 grepping하여 답변을 검색하는 것에 대해서는 읽지 않았습니다.
Chiel ten Brinke

1
@Yokai Chiel ten Brinke가 말한 것 외에도, 허용 된 답변은 긴 옵션을 언급하지 않습니다
user3738870

10

"/some/file.txt"앞뒤에 10 줄의 컨텍스트 (Awk 사용)를 표시하는 "17655"를 검색하고 출력 앞에 줄 번호와 콜론을 차례로 표시합니다. 'grep'이 "-[ACB]"옵션을 지원하지 않는 경우 Solaris에서이를 사용하십시오.

awk '

/17655/ {
        for (i = (b + 1) % 10; i != b; i = (i + 1) % 10) {
                print before[i]
        }
        print (NR ":" ($0))
        a = 10
}

a-- > 0 {
        print (NR ":" ($0))
}

{
        before[b] = (NR ":" ($0))
        b = (b + 1) % 10
}' /some/file.txt;

7

ripgrep

당신은 성능, 사용에 대해 걱정하는 경우 ripgrep에 유사한 문법을 가지고 grep, 예를 들어,

rg -C5 "pattern" .

-C, --context NUM-각 경기 전후에 NUM 줄을 표시합니다.

-A/ --after-context-B/ 와 같은 매개 변수도 있습니다 --before-context.

이 도구는 Rust의 정규식 엔진 위에 구축되어 대용량 데이터에서 매우 효율적 입니다.


5

다음은 @ Ygor 솔루션 입니다.awk

awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=3 a=3 s="pattern" myfile

참고 : 교체 ab라인의 수와 변수 전후.

그것은 그렙의 지원하지 않는 시스템에 특히 유용 -A, -B-C매개 변수를.


4
$ grep thestring thefile -5

-5당신이 얻을 수 5위 경기 'thestring'아래 라인에 해당 -C 5하거나 -A 5 -B 5.


4

Grep에는이라는 옵션 Context Line Control이 있습니다 --context. 간단히 사용할 수 있습니다.

| grep -C 5

또는

| grep -5

트릭을해야합니다


1

나는 컴팩트 한 방법을 사용합니다

grep -5 string file

grep -A 5 -B 5 string file

0

코드를 자주 검색하면 AG 실버 검색 기가 grep보다 훨씬 효율적입니다 (즉, 빠릅니다).

-C 옵션을 사용하여 컨텍스트 행을 표시합니다.

예 :

ag -C 3 "foo" myFile

line 1
line 2
line 3
line that has "foo"
line 5
line 6
line 7
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.