grep은 n줄의 파일을 건너뛰고 그 이후의 내용만 검색합니다.

grep은 n줄의 파일을 건너뛰고 그 이후의 내용만 검색합니다.

대용량 로그 파일이 있고 처음 나타나는 패턴을 파악한 후 다른 패턴을 찾고 싶습니다.직후이런 일이 발생합니다.

예를 들어:

123
XXY
214
ABC
182
558
ABC
856
ABC

182내 경우에는 찾아서 찾고 싶다 .다음일어난ABC

처음에는 간단합니다.

grep -n -m1 "182" /var/log/file

이 출력은 다음과 같습니다.

5:182

ABC의 다음 발생을 찾는 방법은 무엇입니까?

내 생각은 줄 번호 182를 기준으로 grep첫 번째 n줄(위 예에서)을 건너뛰도록 지시하는 것입니다. 그런데 어떻게 해야 합니까?n=5

답변1

한 번에 sedrange 및 uit 입력을 사용할 수 있습니다.q

sed '/^182$/p;//,/^ABC$/!d;/^ABC$/!d;q'

마찬가지로 GNU에서는 grep입력을 두 개로 나눌 수 있습니다 grep.

{ grep -nxF -m1 182; grep -nxF -m1 ABC; } <<\IN
123
XXY
214
ABC
182
558
ABC
856
ABC
IN

...인쇄...

5:182
2:ABC

grep... 발견된 첫 번째 -F고정 문자열 리터럴 , -x전체 줄을 나타냅니다.182읽기부터 시작하여 5줄과 일치하고, 두 번째 줄은 비슷한 유형을 찾습니다.알파벳읽기 시작 부분부터 2줄 일치 - 또는 2줄뒤쪽에첫 번째grep 사직하다5번째 줄을 읽어보세요.

에서 man grep:

-m NUM, --max-count=NUM
          Stop  reading  a  file  after  NUM  matching
          lines.   If the input is standard input from
          a regular file, and NUM matching  lines  are
          output, grep ensures that the standard input
          is  positioned  to  just  after   the   last
          matching  line before exiting, regardless of
          the  presence  of  trailing  context  lines.
          This  enables  a calling process to resume a
          search. 

재현 가능한 데모를 위해 여기에 있는 문서를 사용했지만 아마도 다음과 같이 해야 할 것입니다.

{ grep ...; grep ...; } </path/to/log.file

다음과 같은 다른 쉘 복합 명령 구조와 함께 사용할 수도 있습니다.

for p in 182 ABC; do grep -nxFm1 "$p"; done </path/to/log.file

답변2

grepPerl 호환 정규 표현식과 함께 사용됨( ) pcregrep:

pcregrep -Mo '182(.|\n)*?\KABC'

옵션을 사용하면 -M패턴이 여러 줄과 일치하고 \K일치하는 패턴(지금까지)을 출력에 포함하지 않을 수 있습니다. \K전체 영역을 가져오려면 삭제할 수 있습니다.

답변3

> awk '/^182$/ { startline=1; }; startline == 0 { next; }; /^ABC$/ { print "line " NR ": " $0; exit; }' file
line 7: ABC

답변4

또 다른 변형은 다음과 같습니다.

grep -n -A99999 "182" /var/log/file|grep -n -m1 "ABC"

플래그 - 아무것도 놓치지 않았는지 확인하기 위해 일치 후 grep n 라인과 99999를 사용합니다. 더 큰 파일에는 더 많은 줄이 있어야 합니다("wc -l"로 확인).

관련 정보