2009-07-14 3 views
2

파일에서 일치하는 행을 리턴하는 간단한 grep 명령이 있습니다. 여기에 문제가 있습니다 : 때로는 라인이 일치 할 때, 나는 그 라인을 앞에 넣고 싶습니다. 내가 원하는 것은 패턴과 일치하는 모든 라인을 찾는 방법입니다. 그런 다음 서로 다른 패턴을 사용하여 각 결과가 일치하기 전에 라인이 일치하는지 확인하십시오.grep (또는 어쩌면 regex) 일치 전 또는 후에 행의 패턴을 확인하십시오.

'bar'가 포함 된 모든 줄과 'foo'가 포함 된 경우에만 줄 바꿈을 각각 가져 오려고한다고 가정 해 봅시다.

 
    Let's all go to the bar 
    foo foo foo 
    Yippie, a bar. 

답변

9

당신은 상황에 맞는 라인을 포함에 대해서도 -A있다 (경기 전에 상황에 맞는 라인을 포함하도록 -B 옵션을 사용할 수 있습니다 :이 같은 결과를 싶습니다

 
    Spam spam eggs eggs 
    Let's all go to the bar. 
    Blah Blah Blah foo. 
    Meh. 
    foo foo foo 
    Yippie, a bar. 

이 같은 입력을 감안할 때 이후 및 컨텍스트 행을 포함하기 전에 -C). 당신은 파이프 다른 grep에 그 결과를 다음 수 :

# Get all lines matching 'bar' and include one line of context before each match 
# Then, keep only lines matching 'bar' or 'foo' 
grep bar -B1 the-file | grep 'bar\|foo' 
0

는 그렙 2 회

awk '/bar/ && p~/foo/{ 
    print p 
    print 
    next 
}/bar/{print}{ p=$0}' file 
를 사용할 필요가 없습니다