명령을 사용하여 로그 파일에서 로그를 가져 오려고 합니다 grep
. 로그 파일 형식은 다음과 같습니다.
[1/10/16 23:55:33:018 PST] 00000057 ServerObj E SECJ0373E: Exception message
at com.own.ws.wim.util.UniqueNameHelper.formatUniqueName(UniqueNameHelper.java:102)
at com.own.ws.wim.ProfileManager.getImpl(ProfileManager.java:1569)
지금까지는 로그를 얻을 수 있지만 스택 추적도 원합니다.
grep -i '^[[:space:]]*at' --before-context=2 SystemOut.log | grep "1/13/16 7:[1-60]"
output : [1/10/16 23:55:33:018 PST] 00000057 ServerObj E SECJ0373E: Exception message
이것을 달성하는 방법에 대한 아이디어가 있습니까?
답변1
필드 구분 기호 "at"이 있는 awk도 작동합니다. "^["는 날짜 스탬프로 시작하는 줄과 일치합니다. 여기서 $1은 첫 번째 필드입니다.
awk -F"at" '/^\[/{print $1}' test
귀하의 의견에 따르면 귀하의 요구 사항을 올바르게 이해했다면 awk 명령에는 귀하가 찾고 있는 줄이 포함되어야 하며 grep 범위는 7시에서 8시 사이여야 합니다.
그러나 두 개의 목록이 필요한 것 같습니다. 로그 파일에서 awk 명령을 실행하고 이를 다른 파일로 출력하면 됩니다. 그런 다음 두 번째 파일을 awk/grep할 수 있습니다.
awk -F"at" '/^\[/{print $1}' test>> ExtractedLogs.txt
awk -F"at" '$1 ~ "07:"{print $1}' ExtractedLogs.txt>> StackTraceOnly.txt
답변2
"at" 행을 찾은 후 --after-context=2를 추가하여 다른 행을 다시 추가할 수 있습니다.
grep -i '^[[:space:]]*at' --before-context=2 afile | grep --after-context=2 "1/13/16 7:[1-60]"