범위 검색을 수행하기 위해 sed를 사용하고 있습니다. 날짜와 시간의 2016-09-29 01:00
로그 데이터를 구문 분석하고 싶습니다 2016-09-29 01:30
. 그래서 나는 다음 명령을 사용하고 있습니다.
$ sed -n '/2016-09-29 01:/,/2016-09-29 01:30:.*$/p'
그러나 문제는 로그에서 1:30을 사용할 수 없으면 모든 로그를 끝까지 반환한다는 것입니다.
1:30
그렇다면 존재하지 않는 경우 끝까지 다음 레코드로 이동 하도록 이를 처리하는 방법은 무엇입니까 ?
고려해야 할 사항: 로그에는 다음이 포함됩니다.스택 추적따라서 스택 추적을 포함하는 줄은 날짜로 시작하지 않습니다.
답변1
그다지 이상하지는 않습니다. sed
는에스트레메편집하다itor는 행이 발생하는 대로 처리합니다. 이와 같은 범위는 /a/,/b/
행이 발견되는 즉시 선택되고 a
발견된 후에는 더 이상 선택되지 않음을 의미합니다. b
행을 찾을 수 없는 경우 b
행 선택을 중단하지 않습니다 .
여기서는 를 사용해야 합니다 awk
. 이러한 타임스탬프가 줄의 시작 부분에 있다고 가정합니다.
awk '$0 >= "2016-09-29 01:" && $0 < "2016-09-29 01:30"'
범위에 타임스탬프가 있는 행만 선택되므로 타임스탬프가 없는 행은 범위에 타임스탬프가 있는 행 사이에 있더라도 제외됩니다.
이 문제를 해결하는 또 다른 방법은 다음과 같습니다.
awk -v start='2016-09-29 01:' -v end='2016-09-29 01:30' '
$0 >= start && $0 <= end, /^[0-9]{4}([ :-][0-9]{2}){5}/ && $0 >= end'
즉, in과 같은 범위를 사용 sed
하되 두 날짜 사이의 첫 번째 행에 범위를 입력하고 종료 날짜보다 큰 타임스탬프가 있는 행을 찾은 경우에만 이를 유지합니다.