내 로그 파일(log.txt)이 다음과 같다고 가정해 보겠습니다.
2014-01-01 22:30:30 something happened....
2014-01-01 22:30:31 something happened....
2014-01-01 22:30:41 something happened....
이 파일을 추적하여 지난 시간의 로그를 표시하고 추적을 계속하고 싶습니다.
즉
tail <some magic to specify last 1 hour> -f log.txt
그러면 출력은 다음과 같습니다.
2014-01-01 21:30:41 something happened....
...
2014-01-01 22:30:30 something happened....
2014-01-01 22:30:31 something happened....
2014-01-01 22:30:41 something happened....
이를 수행하는 도구가 있습니까?
답변1
oneliner에서 grep과 tail의 조합을 사용할 수 있습니다.
grep "2014-01-01 21:" log.txt; tail -f log.txt
해당 시간부터 시작하여 계속해서 모든 내용을 인쇄합니다.
또는 awk를 사용하여 특정 시간의 시작부터 파일 끝까지 모든 내용을 인쇄하고 그 이후에도 계속 추적할 수 있습니다. 이렇게 하면 필요한 경우 지난 몇 시간을 추적할 수 있습니다.
awk '/2014-01-01 21:/' log.txt; tail -f log.txt
답변2
onehourago=$(date --date='1 hours ago' +"%b%e %H:%M:%S")
echo $onehourago | cat /var/log/auth.log - | sort | sed "1,/$onehourago/d"
sed 명령이 없는 중간 출력:
Aug 7 00:00:03 thinkpux CRON[25475]: pam_unix(cron:session): session closed for user stefan
Aug 7 00:17:01 thinkpux CRON[25504]: pam_unix(cron:session): session closed for user root
Aug 7 00:17:01 thinkpux CRON[25504]: pam_unix(cron:session): session opened for user root by (uid=0)
Aug 7 00:19:33
Aug 7 01:00:02 thinkpux CRON[25652]: pam_unix(cron:session): session opened for user stefan by (uid=0)
Aug 7 01:00:03 thinkpux CRON[25652]: pam_unix(cron:session): session closed for user stefan
Aug 7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session closed for user root
Aug 7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session opened for user root by (uid=0)
산출:
Aug 7 01:00:02 thinkpux CRON[25652]: pam_unix(cron:session): session opened for user stefan by (uid=0)
Aug 7 01:00:03 thinkpux CRON[25652]: pam_unix(cron:session): session closed for user stefan
Aug 7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session closed for user root
Aug 7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session opened for user root by (uid=0)
참고: 먼저 +"%b %e %H:%M:%S"로 날짜를 구성했습니다(%b와 %e 사이의 공백에 유의하세요. 그러나 echo는 두 공백을 하나로 압축합니다. sed를 통해 검색하는 것은 다음과 같습니다. 두 개의 공백이 있고 표현식이 없으므로 월의 날짜가 두 자리인지 한 자리인지 구별하는 것은 복잡하지만 정렬은 추가/누락된 공백에 무관한 것으로 보이며 압축을 방지하기 위한 bash 스위치가 있을 수 있습니다. ? 하지만 날짜 형식이 다르기 때문에 영향을 받지는 않지만 어떻게든 이 접근 방식을 테스트해야 하며 학습자도 같은 함정에 빠질 수 있습니다.
따라서 일반적인 아이디어는 1시간 전의 날짜/시간을 가져오고 로그 파일에서와 같이 형식을 지정하고 로그 파일에 순수 날짜를 추가하고 혼합물을 정렬한 다음 sed를 사용하여 순수 날짜 이전의 항목을 제거하는 것입니다. 콘텐츠.
기억하고 입력하는 것은 재미없지만 스크립트 및/또는 함수에 넣을 수 있습니다.
답변3
답변4
grep
or의 문제awk
는 항상 전체 파일을 읽고 각 줄을 확인해야 한다는 것입니다.- 문제
tail
는 얼마나 많은 행이 필요한지 모른다는 것입니다.
그러니 시험해보고 tac
사용해 awk
보세요 tail -f
.-n0
tac file \
| awk -F'[- :]' -v datefilter="$(date -d -1hour +%s)" 'mktime($1 OFS $2 OFS $3 OFS $4 OFS $5 OFS $6) < datefilter {exit} 1' \
| tac
tail -f -n0
(두 명령 사이에 새로운 줄이 있으면 그 줄을 잃을 수도 있습니다.)