대용량 로그 파일이 있고 처음 나타나는 패턴을 파악한 후 다른 패턴을 찾고 싶습니다.직후이런 일이 발생합니다.
예를 들어:
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
한 번에 sed
range 및 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
grep
Perl 호환 정규 표현식과 함께 사용됨( ) 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"로 확인).