我有一个文件,其中包含各种日期和 IP,我需要每天清除它们。文件格式为:
# 2018-02-21 11:31:37 - user1 - This is a test.
1.1.1.1
# 2018-02-21 11:32:30 - user1 - This is also a test.
2.2.2.2
# 2018-03-06 21:12:44 - user2 - Another comment.
3.3.3.3
每天我都想删除任何注释行及其下方超过 30 天的 IP。为此,我可以轻松创建一个 bash 变量“LAST_MONTH= date --date="-30 days" +%Y-%m-%d
”,然后通过执行“DELETE=$(cat /var/www/html/ips | grep $DATE -A1)”轻松获取行。
从这里开始,我可以从技术上利用 sed 删除诸如“sed -i "s/$DELETE/test/g" "$FILE"” 之类的行,但是其中涉及井号标签和多行,所以现在对我来说不起作用。
您推荐的最佳方法是什么?如果可能的话,我不想创建另一个临时文件。我还对 bash 和 Python 解决方案感兴趣。
谢谢。
答案1
一些 python:警告,我对它还很陌生。
import io
import datetime
buffer = io.StringIO()
ago = datetime.date.today() - datetime.timedelta(days=30)
filename = "file"
with open(filename,"r") as f:
line = f.readline()
while line:
if line.startswith("#"):
date = (line.split())[1]
if date >= ago.isoformat():
buffer.write(line)
line = f.readline()
buffer.write(line)
line = f.readline()
with open(filename, "w") as f:
f.write(buffer.getvalue())
答案2
需要 GNU 日期,并且sponge
来自 moreutils 包写回到同一个文件
awk -v ago="$(date -d '30 days ago' '+%F %T')" '
$1 == "#" && $2" "$3 < ago {getline; next}
{print}
' file | sponge file