다음 타임스탬프 형식의 로그 파일이 있습니다.
2016-06-02 13:59:58.069
제가 작업 중인 로그는 약 한 시간 동안 지속됩니다.
2016-06-02 13:05:06.144
2016-06-02 13:05:06.144
2016-06-02 13:05:06.160
2016-06-02 13:05:06.160
2016-06-02 13:05:06.176
2016-06-02 13:05:06.177
.
.
.
.
2016-06-02 14:05:03.033
2016-06-02 14:05:03.034
2016-06-02 14:05:03.034
2016-06-02 14:05:03.084
2016-06-02 14:05:03.096
2016-06-02 14:05:03.112
awk를 사용하여 마지막 10분을 추출하려고 하면 여전히 전체 파일을 얻을 수 있습니다.
awk -vDate=`date -d'now-10 minutes' +%Y/%m/%d:%H:%M:%S` '$1,$2 > Date {print Date, $0}' logfile.log | less
awk 출력:
2016/06/02:08:57:35 2016-06-02 13:05:06.144
.
.
.
2016/06/02:08:57:35 2016-06-02 14:08:05.214
내가 뭘 잘못했나요?
답변1
다른 방법을 사용하십시오. vDate를 사용하여 grep
줄 번호와 tail
해당 줄 번호의 파일을 가져옵니다.
vDate=`date -d'now-10 minutes' '+%Y-%m-%d %H:%M'`
line=`grep -n "$vDate" logfile.log | head -1 | cut -d: -f1`
tail -n +${line} logfile.log
답변2
노력하다
awk -vDate="`date -d'TZ="UTC" now-10 minutes' +'%Y-%m-%d %H:%M:%S.%3N'`" '$1" "$2 > Date {print Date, $0}'
스키마에서 $1,$2 > Date
쉼표는 출력에서처럼 "이 필드를 결합"한다는 의미가 아닙니다. 대신 패턴이 다음과 같다는 의미입니다.기록 범위. $1
비어 있지 않은 문자열이므로 Always true
일치가 즉시 시작됩니다. 비교하기 전에 필드를 결합하려면 여기에 리터럴 공백을 넣어야 합니다.$1" "$2
Date
다음으로, 예제 출력에서 "2016/06/02:..."로 설정하고 로그에서 "2016-06-02..."를 사용하는 것을 볼 수 있습니다 . 날짜를 비교할 때끈, ASCII /
이후에는 -
테스트가 절대 성공하지 못합니다. 정확히 일치하도록 문자열 형식을 변경하면(셸에서 보호하기 위해 일부 따옴표 추가) 숫자만 달라집니다.
편집하다:
로그 파일 타임스탬프가 표시된 것보다 몇 시간 늦습니다 date -d'now-10 minutes'
. 환경 변수( )를 통해 또는 날짜 문자열 내에서 date
관련 시간대를 사용할 수 있습니다. 그렇지 않은 경우 다음 중에서 올바른 것을 선택하십시오.TZ=UTC awk ...
'TZ="UTC" now...'
UTC
전체 목록.
답변3
awk
start_pattern
end_pattern
다음 구문을 사용하여 섹션 내의 텍스트 줄을 사용하고 인쇄할 수 있습니다 .
$ awk '/start_pattern/, /end _pattern/' filename
에서 인용Linux 쉘 스크립트 매뉴얼.
따라서 다음과 같이 할 수 있습니다.
awk '/2016-06-02 13:55/, /2016-06-02 14:05/' logfile`
필요한 경우 스크립트 파일에 작성할 수도 있습니다.
START=`date --date='now-10 minutes' '+%Y-%m-%d %H:%M'`
END=`date --date='now' '+%Y-%m-%d %H:%M'`
awk "/$START/, /$END/" logfile