이전 타임스탬프가 있는 로그 줄을 제자리에서 삭제

이전 타임스탬프가 있는 로그 줄을 제자리에서 삭제

안녕히 가세요. 로그 파일이 있는데 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

사용 dateadddategrep에서날짜 도구:

dategrep  -i "%Y/%m/%d %T" ">=$(dateadd now -30d)" </path/to/logfile

dateadd지금부터 지난 30일까지의 날짜/시간을 계산합니다. 그런 다음 날짜 문자열보다 최신이거나 같은( ) 날짜 문자열을 dategrep포함하는 stdin의 행만 인쇄합니다 . >=이 경우 로그 줄의 날짜 형식을 지정해야 합니다 -i.

관련 정보