섹션에서 시작하려면 Grep에 대한 도움이 필요합니다


8

코드 섹션을 grep하려는 텍스트 파일이 있습니다. 내가 달성하려는 목표는 특정 줄에서보기를 시작한 다음 그 아래의 내용을 읽을 수 있도록하는 것입니다. 예를 들어. 아래 텍스트에서 노란색의 시작점에서 텍스트 파일을 보는 방법은 무엇입니까? 내용이 무엇이든 관계없이 "노란색"의 내용과 그 아래의 모든 내용을보고 싶습니다.

green
blue
cyan
magenta
purple
brown
yellow
red
orange
more orange
more blue
this is enough

답변:


9

AWK 사용 AWK-이것이 얻을 수있는 가장 간단합니다.

awk '/yellow/,0' textfile.txt

샘플 런

$ awk '/yellow/,0' textfile.txt                                
yellow
red
orange
more orange
more blue
this is enough

그렙

옵션 grep과 함께 사용 --after-context하여 일치 후 특정 양의 줄을 인쇄 할 수도 있습니다

grep 'yellow' --after-context=999999  textfile.txt

컨텍스트 자동 설정을 위해을 사용할 수 있습니다 $(wc -l textfile.txt). 기본적인 아이디어는 당신이 일치하는 것으로 매우 첫 번째 줄이 있고 그 경기 후 모든 인쇄하려면, 당신이 파일에서 1을 뺀 Luckly의 줄 수를 알아야 할 것입니다 --after-context수에 대한 오류가 발생하지 않습니다 줄의 범위를 완전히 벗어난 숫자를 줄 수는 있지만 모르는 경우 총 줄 수는

$ grep 'yellow' --after-context=$(wc -l < textfile.txt) textfile.txt
yellow
red
orange
more orange
more blue
this is enough

명령을 단축하려면 and과 --after-context같은 옵션을 사용 하면 파일 이름 다음에 줄 수로 확장됩니다. 그렇게하면 한 번만 입력 할 수 있습니다-A$(wc -l textfile.txt)textfile.txt

grep "yellow" -A $(wc -l textfile.txt)

파이썬

skolodya@ubuntu:$ ./printAfter.py textfile.txt                                 
yellow
red
orange
more orange
more blue
this is enough

DIR:/xieerqi
skolodya@ubuntu:$ cat ./printAfter.py                                          
#!/usr/bin/env python
import sys

printable=False
with open(sys.argv[1]) as f:
     for line in f:
        if "yellow" in line:
           printable=True
        if printable:
           print line.rstrip('\n')

또는 printable플래그 없이

#!/usr/bin/env python
import sys

with open(sys.argv[1]) as f:
     for line in f:
        if "yellow" in line:
          for lines in f: # will print remaining lines
             print lines.rstrip('\n')
          exit()

grep명령을로 단순화 할 수 있습니다 grep "yellow" -A $(wc -l textfile.txt).
바이트 사령관

@ByteCommander yup도 수행 할 수 있습니다. 명확성을 위해 전체 옵션을 사용했습니다
Sergiy Kolodyazhnyy

1
@ByteCommander 멋진 해킹입니다. 불행히도 파일 이름에 공백이 없기 때문에 작동합니다.
kasperd

@kasperd 아, 맞아요. 이 경우 Serg의 원래 명령으로 돌아 가야합니다 grep "yellow" -A $(wc -l < "my colors.txt") "my colors.txt".
바이트 사령관

5

당신은 그것을 할 수 있습니다 :

awk '/yellow/{f=1}f' file

여기서 "file"은 텍스트를 포함하는 파일 이름입니다.


좋은 생각은 비슷하게 생각> :)
Sergiy Kolodyazhnyy

5

아닌 grep,하지만 사용 sed:

sed -n '/^yellow$/,$p' file
  • -n: 인쇄 금지
  • /^yellow$/,$: 첫 번째 항목부터 yellow마지막 행까지 정확하게 일치하는 주소 범위
  • p: 주소 범위의 행을 인쇄합니다
% sed -n '/^yellow$/,$p' file
yellow
red
orange
more orange
more blue
this is enough

5

파티에 늦게 :)

사용 grep:

grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
  • -P Perl 호환 정규식을 사용할 수 있습니다

  • -z 입력 파일을 개행 문자가 아닌 ASCII NUL로 구분합니다.

  • -o 원하는 부분 만 취합니다

  • (?s)DOTALL 수정 자이므로 토큰 .(모든 문자)을 사용하여 줄 바꿈을 일치시킬 수 있습니다.

  • 에서 \n\K,이 \n줄 바꿈과 일치, \K경기를 폐기

  • yellow\n.*일치 yellow하고 개행 문자가 표시되고 그 이후의 모든 항목도 선택되어 출력에 표시됩니다.

예:

% grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
yellow
red
orange
more orange
more blue
this is enough

적은 사용 python:

#!/usr/bin/env python2
with open('file.txt') as f:
    lines = f.readlines()
    print ''.join(lines[lines.index('yellow\n'):])
  • lines 파일의 모든 줄을 포함하는 목록입니다 (마지막 줄 바꿈 포함)

  • lines.index('yellow\n')발견 된 lines곳 중 가장 낮은 지수를 제공합니다yellow\n

  • lines[lines.index('yellow\n'):]목록 슬라이싱을 사용하여 yellow\n끝까지 시작하는 부분을 가져옵니다.

  • join 목록의 요소를 결합하여 문자열로 출력합니다.


멋지지만, 파이썬 코드는 "노란색"과 동일한 전체 줄만 찾지 만 "더 많은 노랑"과 같은 줄은 감지하지 않습니다.
바이트 사령관

@ByteCommander OP의 예에서 나는 그들이 단지 라인 yellow에서 일치하고 싶다는 것이 분명하다고 생각합니다 . 또한 그렇지 않다면 우리는 python자신의 알고리즘 을 변경해야합니다 .
heemayl

그래 어쨌든 그것은 비판이 아니라 답을 향상시키기위한 힌트 일뿐입니다. 다른 사람이 이것을 읽으면 코드가 작동 grep하고 전체 줄과 일치하지 않는다고 가정 할 수 있습니다 . 나는 btw를 찬성했다.
바이트 사령관

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