두 줄 사이의 데이터를 추출하는 명령

두 줄 사이의 데이터를 추출하는 명령

로그 파일의 줄 번호부터 시작하여 예외와 해당 스택 추적을 추출해야 합니다. 출발선 번호를 잘못 알고 있어요. 아래 예에서 스택 추적이 끝나는 위치를 어떻게 알 수 있습니까? 도움을 주셔서 감사합니다


--------
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

    지정한 줄 번호에서 변수를 f1로 설정합니다.

  • 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}

    f0이 아닌 경우 해당 행을 인쇄합니다.

    간결하게 하기 위해 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}

관련 정보