unix 如何根据时间戳删除文件中的日志消息/应从文件中删除超过7天的消息

xggvc2p6  于 2022-12-23  发布在  Unix
关注(0)|答案(2)|浏览(182)

如何根据时间戳删除文件中的日志消息/应将超过7天的消息从文件中删除。
日志文件消息示例-

2022-12-21T09:36:48+00:00 LONSTBYRDEV02 auth_log:

这些是文件中开头带有时间戳的行,我只想删除7天前的所有数据。在这种情况下,考虑到今天的日期是12月22日,因此应删除12月15日之前的所有行
你知道任何命令或任何东西,我可以包括在脚本中,并删除行使用循环或东西。
请建议。
任何人都可以帮助基于上述情况下,它应该删除所有行早于12月15日在这种情况下。
我已经写了这个和进一步没有工作。
我的密码-

current_DT=$(date +"%m-%d-%y-%T")
echo $current_DT

cutoff=$( date -d "7 days ago"  +"%m-%d-%y-%T")
echo $cutoff

while read -r line ; do
  timestamp=$( date -d "$( echo $line)" )
  echo $timestamp
  if [ $timestamp -gt $cutoff ] ; then
    echo "  Timestamp over cutoff old. Deleting lines."
    sed -i "/^$hostname:/d" $hosts
  fi
done

我得到的输出是-

12-22-22-08:17:22
12-15-22-08:17:22
68de4m5k

68de4m5k1#

通常,对于日志,您会(正如@Gilles Quenot在评论中建议的那样)使用logrotate进行日志记录。
你可以从另一个Angular 来看:不删除所有旧的,但保留所有7天。

#!/bin/bash

logfile="$1"

for i in $(seq 0 6) ; do
    day=$(date +%Y-%m-%d -d -%{i}days)
    grep "^${day}T" "$logfile"
done
4sup72z8

4sup72z82#

也许另一种方法。寻找更新的行,然后停止。

# Set cutoff mark to start of file
mark=0

# Get cutoff time in seconds
cutoff=$( date -d '7 days ago' +%s )

# Loop through file
while read line
do
    # Separate date
    line_date=$( echo $line | cut -d' ' -f1 )

    # Convert to seconds
    line_sec=$( date +%s ${line_date} )

    # If newer, get out of loop
    [ ${line_sec} -gt ${cutoff} ] && break

    # Move mark to next line
    (( mark++ ))
done < my.log

# Delete older lines
sed -i "1,${count}d" my.log

相关问题