정규식을 통해 여러 줄의 로그를 추출하려고 합니다.
그런데 로그파일이 너무 커서 힘드네요. (약 10GB)..
다양한 방법을 시도했지만 원하는 결과를 얻지 못했습니다.
첫 시도)
1) "숭고한 앱"에서 정규식을 사용하십시오. => 문제: 메모리 부족이 표시됩니다.
2) "슈퍼 편집 앱"에서 정규 표현식을 사용하세요. => 문제: 메모리 부족이 표시됩니다.
두 번째 시도) osx의 터미널에서 "sed" 프로그램을 사용합니다.
사용된 연산)
$sed -E -n '/.*output:[\S\s]*?AAA[\S\s]*?END.*/p' ./AppLog.txt
AAA가 키워드를 검색하고 있습니다. (사용자 ID)
"RE 오류: 잘못된 중복 연산자 피연산자"라고 표시됩니다.
AppLog.txt의 내용입니다.
:
:
DEBUG|2018-03-27,14:41:43.089|print log
DEBUG|2018-03-27,14:41:43.089|print log
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID = {"AAA"} <= searching key
01 USER_NAME = {"N"}
02 USER_TEL = {"001-1234-1234"}
:
05 USER_LOCATION = {"earth"}
[END]
=============================================
DEBUG|2018-03-27,14:41:43.089|print log
DEBUG|2018-03-27,14:41:43.089|print log
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID = {"BBB"} <= searching key
01 USER_NAME = {"N"}
:
03 USER_LOCATION = {"saturn"}
[END]
=============================================
DEBUG|2018-03-27,14:41:43.089|print log
DEBUG|2018-03-27,14:41:43.089|print log
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID = {"AAA"} <= searching key
01 USER_NAME = {"N"}
02 USER_ADDR = {"bla~ bla~~"}
:
010 JOB = {"designer"}
[END]
=============================================
:
:
원하는 결과는 다음과 같습니다.
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID = {"AAA"} <= searching key
01 USER_NAME = {"N"}
02 USER_TEL = {"001-1234-1234"}
:
05 USER_LOCATION = {"earth"}
[END]
=============================================
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID = {"AAA"} <= searching key
01 USER_NAME = {"N"}
02 USER_ADDR = {"bla~ bla~~"}
:
010 JOB = {"designer"}
[END]
=============================================
답변1
pcregrep
일하다:
pcregrep -M \
'DEBUG.*output:\n===*\n.*?\n.*?USER_ID.*?"AAA".*?(\n*?.*?\n*)*?===*' AppLog.txt
답변2
AWK--
awk -v RS='[\\=]+[\\=]' -v FS='\n' '/{"AAA"}/{ printf "%s%s%s%s",prevline,RT, $0, RT }{prevline="\n"$(NF-1)"\n"$NF}' ./AppLog.txt
레코드는 ======로 구분됩니다.
마지막 두 줄은 prevline에 저장됩니다.
이전에 저장된 값, 구분 기호, 현재 값 및 구분 기호를 다시 인쇄합니다.
답변3
awk가 더 빠른 도구일 수 있습니다. 이 [END]
줄을 다음과 같이 사용하십시오.오른쪽에코코드에스쪼개는 도구:
awk -vRS='\\[END\\]' -vORS='[END]\n' '/\"AAA\"/' infile |
awk '/output:$/,/\[END\]/'
첫 번째 행 선택오른쪽포함된 기록 "AAA"
.
두 번째 줄은 출력을 output:
과 사이의 줄로 제한합니다 [END]
.
답변4
조각의 경우:
FILE=${1-data1}
# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
pl " Results:"
cgrep -d "/////" -w "DEBUG" +w "END" "AAA" $FILE
이는 다음과 같이 생성됩니다.
Results:
/////
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID = {"AAA"} <= searching key
01 USER_NAME = {"N"}
02 USER_TEL = {"001-1234-1234"}
:
05 USER_LOCATION = {"earth"}
[END]
/////
DEBUG|2018-03-27,14:41:43.089|output:
=============================================
[START]
00 USER_ID = {"AAA"} <= searching key
01 USER_NAME = {"N"}
02 USER_ADDR = {"bla~ bla~~"}
:
010 JOB = {"designer"}
[END]
암호정규식텍스트 주위에 창을 지정할 수 있습니다(AAA)수색. 따라서 이 경우에는 다시 다음으로 돌아갑니다.디버그, 그리고 다음 주소로 전달됨:끝.
우리는 ATT 코드를 사용했습니다정규식몇 년 동안. 컴파일이 필요하지만 프로세스 중에 오류가 발생하지 않았습니다.
다음은 몇 가지 세부정보입니다.정규식:
cgrep shows context of matching patterns found in files (man)
Path : ~/executable/cgrep
Version : 8.15
Type : ELF 64-bit LSB executable, x86-64, version 1 (SYS ...)
Home : http://sourceforge.net/projects/cgrep/ (doc)
행운을 빕니다... 건배, drl