sed를 사용하여 잠재적인 여러 줄 로그 항목 선택

sed를 사용하여 잠재적인 여러 줄 로그 항목 선택

sed저는 애플리케이션 서버 로그에서 개별 로그 항목을 골라내는 명령을 생각해 내려고 노력해 왔습니다 .

로그의 형식은 다음과 같습니다.

LOG|2016-07-26_15:37:45:536|entry1|!
LOG|2016-07-26_15:37:45:536|entry2|extra data
on new line|!
LOG|2016-07-26_15:37:45:536|entry3|!
LOG|2016-07-26_15:37:45:536|entry4|!
LOG|2016-07-26_15:37:45:536|entry5|!

보시다시피 일부 항목에는 행이 하나만 있고 일부 항목에는 추가 데이터가 있는 여러 행이 있습니다. 항목은 항상 로그 유형(위의 "LOG"로 단순화됨)으로 시작하고 항상 다음으로 시작됩니다.|!

이제 이것이 내가 지금까지 가지고 있는 것입니다:

sed -n -e '/'$id'/,/|!/ p'

이는 여러 줄의 로그 항목에 적합합니다.

$ cat log | sed -n -e '/entry2/,/|!/ p'
LOG|2016-07-26_15:37:45:536|entry2|extra data
on new line|!

그러나 한 줄 항목에는 다음 항목도 표시되므로 좋지 않습니다.

$ cat log | sed -n -e '/entry3/,/|!/ p'
LOG|2016-07-26_15:37:45:536|entry3|!
LOG|2016-07-26_15:37:45:536|entry4|!

sed단일 및 여러 줄 로그 항목을 처리하기 위해 위 내용을 수정하는 방법에 대한 아이디어가 있습니까?

답변1

다른 접근 방식은 항목이 끝날 때까지 일치하는 줄을 반복하는 것입니다.

sed '/entry3|/{:a;/!$/!{n;ba;};p;};d' log

답변2

다음과 같은 경우는 개별적으로 처리해야 합니다.

sed -n '/entry3.*[^!]$/, /|!/p; /entry3.*!/p ' log

행이 ID와 일치하는 경우그리고느낌표로 끝나면 인쇄됩니다. 행이 ID와 일치하는 경우그리고 아니느낌표로 끝나며 주소 범위의 시작을 표시합니다.

관련 정보