로그 파일의 줄 번호부터 시작하여 예외와 해당 스택 추적을 추출해야 합니다. 출발선 번호를 잘못 알고 있어요. 아래 예에서 스택 추적이 끝나는 위치를 어떻게 알 수 있습니까? 도움을 주셔서 감사합니다
예 -------- 2016-10-07 15:49:07,537 오류 및 일부 예외 스택 추적 라인 1 스택 추적 라인 2 . . 스택 추적 라인 n 2016-10-07 15:49:07,539 디버깅 등 2016-10-07 15:49:07,540 디버깅 등
답변1
요약하자면, 지정한 줄 번호로 시작하여 날짜로 시작하는 다음 줄 직전까지 계속해서 줄을 인쇄하려고 합니다. 귀하의 예에서 시작 행은 3입니다. 이 경우:
$ awk '{if (NR==3)f=1; else if (/^[0-9-]{10} /)f=0} f{print}' trace.log
2016-10-07 15:49:07,537 ERROR Some exception
stacktrace line 1
stacktrace line 2
.
.
stacktrace line n
위 코드의 작동 방식은 다음과 같습니다.
if (NR==3)f=1
지정한 줄 번호에서 변수를
f
1로 설정합니다.else if (/^[0-9-]{10} /)f=0
다른 줄에서는
f
줄이 10자(숫자 또는 대시 다음에 공백이 오는 경우)로 시작하면 0으로 설정됩니다. 즉,f
날짜로 시작하는 첫 번째 행은 0으로 설정됩니다.필요한 경우 더 복잡한 정규식을 사용하여 날짜의 시작을 식별할 수 있습니다. 예를 들어, 다음에서는 줄이 데이터처럼 보이는 항목으로 시작하고 그 뒤에 공백, 시간처럼 보이는 항목, 마지막으로 쉼표가 와야 합니다.
awk '{if (NR==3)f=1; else if (/^[0-9-]{10} [0-9:]{8},/)f=0} f{print}' trace.log
이는 더욱 개선될 수 있습니다.
f{print}
f
0이 아닌 경우 해당 행을 인쇄합니다.간결하게 하기 위해
f{print}
로 바꾸면 됩니다f
. 이는 작업을 명시적으로 지정하지 않으면print
기본 작업이 사용되기 때문에 가능합니다.
선택하다
awk의 일부 버전은 반복 요소를 지원하지 않습니다(예: {10}
시스템의 경우).
awk '{if (NR==3)f=1; else if (/^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] /)f=0} f{print}' trace.log
답변2
모든 스택 추적 줄이 공백(공백/탭)으로 시작한다고 가정하면 [[:blank:]]
줄 시작 부분( )에서 일치시킬 수 있습니다 ^
.
grep '^[[:blank:]]' file.log
답변3
추출할 트레이스가 라인 2에서 시작 trace.log
하고 그 끝이 YYYY-MM-DD 형식의 날짜로 시작하는 라인으로 표시되는 경우(그리고 트레이스에 그러한 라인이 없음)
sed -nE '2,/^[0-9]{4}-[0-9]{2}-[0-9]{2} /p' trace.log
2번째 줄부터 시작하여 각 줄을 인쇄합니다.통과하다철사N+3(추적 후 날짜로 시작하는 첫 번째 줄). 마지막 줄이 필요하지 않으므로 위의 내용을 마지막 줄을 제거하는 명령으로 파이프할 수 있습니다.
sed -nE '2,/^[0-9]{4}-[0-9]{2}-[0-9]{2} /p' trace.log | head -n -1
또는
sed -nE '2,/^[0-9]{4}-[0-9]{2}-[0-9]{2} /p' trace.log | sed '$d'
날짜를 검색해야 하는 경우그리고 시간을 선택한 다음 다음을 검색하세요.
^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}