내 로그 파일을 처리해야 합니다 /var/log/mylogs.log
. 나는 새 항목에만 관심이 있지만 Jul 20 15:00:00
로그에는 이전 항목도 포함되어 있기 때문입니다.
cat
특정 날짜보다 오래된 항목 만 입력할 수 있는 쉬운 방법이 있습니까 ?
답변1
날짜를 구문 분석하기 위한 작은 스크립트를 작성할 수 있습니다 bash
.date
#!/usr/bin/env bash
## Your date threshold
limit="Jul 20 15:00:00"
## Your limit in seconds since the UNIX epoch
limit_seconds=$(date -d "$limit" +%s)
while read line; do
## Extract the date and convert to seconds since epoch for comparison
date=$(date -d "$(echo "$line" | cut -d ' ' -f -4)" +%s);
## Is this newer than the limit? If yes, print the line
if [ "$date" -ge "$limit_seconds" ]; then
echo "$line"
fi
done
이 스크립트를 경로(예 /usr/local/bin/parse_log.sh
: )에 저장한 후 다음과 같이 실행할 수 있습니다.
parse_log.sh < /var/log/mylogs.log
답변2
Perl을 사용하여 이 작업을 수행하는 데 관심이 있을 수 있습니다.
perl -wlne '/^Jul\ 20\ 15\:00\:00/ .. eof() and print' /path/to/logfile.txt
특정 요구 사항에 맞게 정규식을 조정해야 할 수도 있습니다.
답변3
날짜를 쉽게 조작할 수 있는 언어로 이 작업을 수행하는 것이 가장 좋습니다. 각 로그 줄은 mmm dd HH:MM:SS
날짜 형식으로 시작하고 모든 로그 항목은 현재 연도의 것이라고 가정합니다 .
<var/log/mylogs.log perl -MDate::Parse -e '
$cutoff = str2time($ARGV[0]);
while (<STDIN>) {
print if /^(... [ 0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9])/ and
str2time($1) <= $cutoff
}
' 'Jul 20 15:00:00'
이 코드 조각은 이전 날짜가 있는 모든 행을 인쇄합니다. 최신 항목이 필요한 경우 비교를 반대로 수행하십시오( str2time($1) >= $cutoff
). 오래된 항목을 인쇄할 때 항목이 너무 늦게 도착하면 즉시 종료하여 처리 시간을 절약할 수 있습니다.
<var/log/mylogs.log perl -MDate::Parse -e '
$cutoff = str2time($ARGV[0]);
while (<STDIN>) {
exit if /^(... [ 0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9])/ and
str2time($1) > $cutoff;
print;
}
' 'Jul 20 15:00:00'
답변4
또한 sed를 사용해 보십시오:
sed -n '/^Jul\ 20\ 15\:00\:00/,/eof()/p' /path/to/logfile.txt