![마지막 패턴이 만족되지 않으면 Sed 범위 문제가 발생합니다.](https://linux55.com/image/139301/%EB%A7%88%EC%A7%80%EB%A7%89%20%ED%8C%A8%ED%84%B4%EC%9D%B4%20%EB%A7%8C%EC%A1%B1%EB%90%98%EC%A7%80%20%EC%95%8A%EC%9C%BC%EB%A9%B4%20Sed%20%EB%B2%94%EC%9C%84%20%EB%AC%B8%EC%A0%9C%EA%B0%80%20%EB%B0%9C%EC%83%9D%ED%95%A9%EB%8B%88%EB%8B%A4..png)
범위 검색을 수행하기 위해 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
하되 두 날짜 사이의 첫 번째 행에 범위를 입력하고 종료 날짜보다 큰 타임스탬프가 있는 행을 찾은 경우에만 이를 유지합니다.