지난 5분 동안 IPA 호스트의 로그 파일을 탐색하고 새 사용자 생성이나 DNS 변경과 같은 사항에 대한 업데이트를 얻으려고 합니다. 이 작업을 주기적으로 수행하여 5분마다 이전 5분을 확인하고 일부 문자열을 확인 및 일치시킨 다음 해당 결과를 이메일로 보내도록 하고 싶습니다. 로그에 표시된 유형의 문자열을 쉽게 비교하는 방법을 모르겠습니다.
20200114184803 = 2020-01-14 18:48:03
time: 20200114184803
Stuff
Stuff
Stuff
time: 20200114184804
Stuff
Stuff
Stuff
time: 20200114184811
Stuff
Stuff
Stuff
답변1
나는 그것을 몇 가지 변수로 나누었지만 다음 단계를 수행하거나 파이핑하면 더 잘 처리할 수 있습니다.
fma=`date --date='5 minutes ago' +"%Y%m%d%H%M%S"`
line_num=`tac file.txt | awk -v five_min_ago=$fma\
'(NF > 1 && $2 < five_min_ago ){print NR; exit 1}'`
tail -$line_num file.txt
설명하다:
fma=...
5분 전의 쉘 변수에 년, 월, 일, 시, 분, 초 형식으로 저장되어 있다고 하는데fma
이것이date
로그에서 수행하는 작업인 것 같습니다.line_num=...
파일을 거꾸로 읽고 로 파이프한다고 가정해 보겠습니다 . 프로그램awk
에서 bash 변수를 as로 저장 한 다음 필드 수가 1을 초과하고 로그 시간이 목표 시간보다 적으면 지금까지 본 줄 수를 인쇄합니다. (보이지 않는 행 포함) t 한정) 종료합니다. 결과를 쉘 변수로 저장하십시오 .awk
$fma
five_minutes_ago
line_num
- 마지막으로 다음을 사용하여
tail
마지막line_num
행을 가져옵니다.file.txt
참고: "물건" 이상의 정보가 있을 수 있으므로 필드 확인 횟수를 조정해야 하지만 이렇게 하면 대부분의 결과를 얻을 수 있습니다.
답변2
awk
내 스크립트에서 이 문제를 해결했습니다 .
ONE_HOUR_AGO="$(date -d '1 hour ago' +%Y%m%d%H)"
NOW="$(date +%Y%m%d%H)"
awk '/time: '$NOW'/,/time: '$ONE_HOUR_AGO'/' log_file.txt
이를 통해 타임스탬프 관련 문제가 해결되었고 로그 파일을 구문 분석할 수 있었습니다.