로그 파일에서 특정 문자열을 구문 분석하려면 다음 명령을 사용하고 있습니다. 그런 다음 로그에서 거꾸로 검색하여 실제로 원하는 데이터를 찾습니다. 문제는 아래 예와 같이 50개 행만 반환한다는 것입니다. 내가 찾고 있는 텍스트가 5줄 뒤인지, 200줄 뒤인지, 아니면 그 이상인지 확실하지 않습니다. 로그 파일에서 특정 문자열을 검색하고 해당 문자열이 발견되면 두 번째 문자열이 얼마나 떨어져 있는지 알지 못하더라도 로그에서 뒤로 검색하여 두 번째 문자열을 찾는 방법이 있습니까? 첫 번째 문자열은 여러 번 나타날 수도 있습니다. 따라서 첫 번째 문자열의 각 인스턴스에 대해 뒤로 검색하여 두 번째 문자열에서 데이터를 수집할 수 있기를 원합니다.
grep -B50 "Server returned HTTP response code: 500 for URL:" LCSoap_8.log | \
tac | grep -P -o '(?<=qualified-src-dn=).*(?=src-dn)'
답변1
tac LCSoap_8.log | sed -n '
/Server returned HTTP response code: 500 for URL:/,/qualified-src-dn=.*src-dn/!d
s/.*qualified-src-dn=\(.*\)src-dn.*/\1/p'
또는 다음을 재사용하세요 grep
:
tac LCSoap_8.log | sed '
/Server returned HTTP response code: 500 for URL:/,/qualified-src-dn=.*src-dn/!d' |
grep -Po '(?<=qualified-src-dn=).*(?=src-dn)'
sed '/A/,B/!d'
A̲
d̲는 다음 줄까지 (!̲)를 제외한 모든 줄을 삭제합니다 B̲
.
답변2
유사한 문제에 대한 가능한 PCRE 기반 솔루션은 다음과 같습니다.패턴을 검색하고 다른 패턴으로 시작하는 처음 몇 줄을 인쇄합니다.
grep -zPo '.*abc.*(?=(?s)(?(?!abc).)*?xyz)' file
abc
각 인스턴스 앞에 나타나는 마지막 줄에 출력을 포함합니다.xyz
예를 들어, 주어진 파일
1 abc
2 abc
3 abc
4 abc
5 abc
6 bcd
7 cde
8 def
9 xyz
10 xyz
그 다음에
$ grep -zPo '.*abc.*(?=(?s)(?(?!abc).)*?xyz)' file
5 abc