안녕히 가세요. 로그 파일이 있는데 30일이 지난 줄을 삭제하고 싶습니다.
문서 내용:
2017/04/04 15:53:22 [11487] building file list
2017/04/04 15:53:22 [11487] done
2017/04/04 15:53:22 [11487] sent 163 bytes received 12 bytes 350.00 bytes/sec
2017/04/04 15:53:22 [11487] total size is 48640 speedup is 277.94
2017/04/04 15:53:29 [11493] building file list
2017/04/04 15:53:29 [11493] done
awk를 사용해 보았지만 파일에서 인라인 편집을 수행할 수 없습니다. v 3.7.0만 있기 때문에 gawk를 솔루션으로 사용할 수 없습니다. 누군가 sed에 도움을 줄 수 있기를 바랍니다. 라이너를 찾는 것이 좋습니다. 이것은 bash에 있습니다.
답변1
하루에 적어도 하나의 항목이 있을 것이라고 확신할 수 있다면 다음과 같이 말할 수 있습니다.
sed -n '\|'$(date +'%Y/%m/%d' -d '30 days ago')'|,$p' log
전제는 GNU 가 있다는 것입니다 sed
. 그렇지 않은 경우 날짜에서 슬래시를 이스케이프 처리해야 합니다.
답변2
grep -v "$(date '+%Y/%m/%d' -d '30 days ago')*" logfile
답변3
당신이 가지고 있다면 perl
:
perl -MPOSIX -ni -e '
BEGIN{$cutoff = strftime("%Y/%m/%d %T", localtime(time - 30*86400))}
print if $_ ge $cutoff' file.log
GNU가 있는 경우 date
:
file=file.log
{
rm -f -- "$file" &&
awk -v "cutoff=$(date -d '30 days ago' '+%Y/%m/%d %T')" '
$0 >= cutoff' > "$file"
} < "$file"
명확하게 하기 위해 둘 다 몇 줄에 있지만 필요한 경우 한 줄에 자유롭게 then을 입력할 수 있습니다. 변형의 줄을 결합할 때 ;
및 file.log
사이에 및 를 {
사용해야 합니다 "$file"
.}
awk
답변4
사용 dateadd
및 dategrep
에서날짜 도구:
dategrep -i "%Y/%m/%d %T" ">=$(dateadd now -30d)" </path/to/logfile
dateadd
지금부터 지난 30일까지의 날짜/시간을 계산합니다. 그런 다음 날짜 문자열보다 최신이거나 같은( ) 날짜 문자열을 dategrep
포함하는 stdin의 행만 인쇄합니다 . >=
이 경우 로그 줄의 날짜 형식을 지정해야 합니다 -i
.