微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

删除日志文件中特定日期之前的行

如何解决删除日志文件中特定日期之前的行

我有一个 ffmpeg 进程日志文件,其中每天都会附加日志数据。我想通过浏览日志并删除属于某个日期的行来对此日志进行自动维护。 我尝试了一些东西,但没有帮助。

我该怎么做?请帮忙。谢谢。

示例。删除 6 月 1 日之前的所有行。

#!/bin/bash

var=`date -d "Now-30 day" | awk '{print $3}'`
path="/home/pi/scripts/"

## Removing Entries before 30 Days ####
for logs in $path/process.log; do

awk -v rot=$var '{ if ($NF > rot ) {print $0}}' $logs > $path/temp.log
mv $path/temp.log $logs

done

包含 6 月之前数据的 process.log 文件示例我想删除所有以前的数据。

Oct 28 06:48:15 #####################################Start Time########################################

Stopping Transaction Video Recording
ffmpeg version 4.2.1-static https://johnvansickle.com/ffmpeg/  copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 6.3.0 (Debian 6.3.0-18+deb9u1) 20170516
  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-6 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libfribidi --enable-libass --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libxml2 --enable-libxvid --enable-libzimg
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
/dev/v4l/by-id/usb-WN-720P-HD_WN-720P-HD_WN-720P-HD-video-index0: Device or resource busy

Oct 28 06:48:17 #####################################End Time########################################


Oct 29 07:38:13 #####################################Start Time########################################

Stopping Transaction Video Recording
ffmpeg version 4.2.1-static https://johnvansickle.com/ffmpeg/  copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 6.3.0 (Debian 6.3.0-18+deb9u1) 20170516
  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-6 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libfribidi --enable-libass --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libxml2 --enable-libxvid --enable-libzimg
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
/dev/v4l/by-id/usb-WN-720P-HD_WN-720P-HD_WN-720P-HD-video-index0: Device or resource busy

Oct 29 07:38:13 #####################################End Time########################################"

这是我要保留的数据,即当前月份的数据:

Jun 02 09:49:08 #####################################Start Time########################################

Stopping Transaction Video Recording
ffmpeg version 4.2.1-static https://johnvansickle.com/ffmpeg/  copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 6.3.0 (Debian 6.3.0-18+deb9u1) 20170516
  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-6 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libfribidi --enable-libass --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libxml2 --enable-libxvid --enable-libzimg
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
[video4linux2,v4l2 @ 0x36e75e0] The driver changed the time per frame from 1/5 to 1/30
[mjpeg @ 0x36e8530] EOI missing,emulating
Input #0,video4linux2,v4l2,from '/dev/v4l/by-id/usb-WN-720P-HD_WN-720P-HD_WN-720P-HD-video-index0':
  Duration: N/A,start: 13731.683520,bitrate: N/A
    Stream #0:0: Video: mjpeg (Baseline),yuvj422p(pc,bt470bg/unkNown/unkNown),1280x720,30 fps,30 tbr,1000k tbn,1000k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> mpeg4 (native))
Press [q] to stop,[?] for help

解决方法

我会使用 sed

sed -i.bak '/^Jun 01/,/^Jun 01.*$\n/!d' log.txt
  1. 这将创建一个名为 log.txt.baklog.txt 备份。不过,我还是建议您先使用不同的名称进行备份。
  2. 这假设 log.txt 中存在 Jun 01

已编辑

#!/bin/bash

target_file='log.txt'
target_date='Jun 01'

line=$(awk -v date="$target_date" '
    date==$1" "$2 {
        if(n++==0) { line=FNR
        } else { n=0 }
    } END {
        print line-1
    }' "$target_file")

if [[ "$line" > 1 ]]; then
    sed -i.bak "1,${line}d" "$target_file"
fi

与上面的命令类似,它将创建一个名为例如的备份文件。 log.txt.bak。根据您的需要更改 target_filetarget_date。 即使有多个重复,此脚本也会删除 日期 之前的所有行。

,

我们缺少编码防水的元素。我们需要知道 a.o.如果可以在日志文件中找到过去几年的条目,因为日志文件没有提到条目的年份,只有月份和日期。

我们假设显然未来的日期对应于前几年的条目。如果您在一月初运行该脚本,您将删除 12 月份小于 30 天的条目。

这意味着如果没有更多的知识,就无法以完全令人满意的方式解决问题。有时,日志文件的名称可能包含一些我们在此处忽略的有关年份的有用信息。

无论如何,下面的解决方案可能有效,但不是很理想:

#!/bin/bash

#time stamp older entries to keep
ts_now=$(date +"%s" -d now)
ts_oldest_to_keep=$(date +"%s" -d "now - 30 days")
#adapt path to point to the directory where log files are living
path="."

for ts in $(grep "Start Time" "$path/"*".log" | awk '{print $1,$2}' | date +"%s" -f - | sort -u)
do 
  # get the timestamp corresponding to all the entries to be removed
  if [ $ts -lt $ts_oldest_to_keep ] || [ $ts -gt $ts_now ]
  then 
    # convert the timestamp into the string "%b %d" i.e. the abbreviated month 
    # name in English followed by space and zero padded day of month.
    # LC_ALL=C to make sure you get an English name of month
    ym=$(LC_ALL=C date +"%b %d" -d "@$ts") 
    # delete the block of lines beginning with "$ym" and ending with 
    # the same string
    sed -i "/^$ym.*Start Time/,/^$ym.*End Time/d" "$path/"*".log"
  fi
done

您首先从日志文件中获取所有可能的日期。您将日期转换为时间戳,以便对日期进行数字比较,并使用 sed 删除行块,而无需临时文件。

也可以一次性在 AWK 中寻找解决方案,但 AWK 缺少一个标准函数,可以轻松地将日期转换为 Jun 01

无论如何,在乱搞之前备份你的日志文件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。