마지막 패턴이 만족되지 않으면 Sed 범위 문제가 발생합니다.

마지막 패턴이 만족되지 않으면 Sed 범위 문제가 발생합니다.

범위 검색을 수행하기 위해 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하되 두 날짜 사이의 첫 번째 행에 범위를 입력하고 종료 날짜보다 큰 타임스탬프가 있는 행을 찾은 경우에만 이를 유지합니다.

관련 정보