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와 일치하는 경우그리고 아니느낌표로 끝나며 주소 범위의 시작을 표시합니다.