로그 파일에서 현재 시간의 X분을 추출합니다.

로그 파일에서 현재 시간의 X분을 추출합니다.

다음 타임스탬프 형식의 로그 파일이 있습니다.

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

awkstart_patternend_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

관련 정보