파일에서 일치하는 줄 제거

파일에서 일치하는 줄 제거

매일 삭제해야 하는 다양한 날짜와 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를 제거하고 싶습니다. 이를 위해 "LAST_MONTH= date --date="-30 days" +%Y-%m-%d"라는 bash 변수를 쉽게 수행할 수 있으며 "DELETE=$(cat /var/www/html/ips | grep $DATE -A1)"을 수행하여 충분히 쉽게 행을 얻을 수 있습니다.

여기에서 기술적으로 sed를 사용하여 "sed -i "s/$DELETE/test/g" "$FILE""과 같은 줄을 지울 수 있지만 해시 태그와 여러 줄이 관련되어 있으므로 실제로 작동하지 않습니다. 지금 바로.

이를 수행하는 가장 좋은 방법으로 무엇을 추천하시겠습니까? 가능하다면 다른 임시 파일을 만들고 싶지 않습니다. 나는 또한 bash와 Python 솔루션 모두에 관심이 있습니다.

감사해요.

답변1

일부 파이썬: 경고, 저는 꽤 처음 접했습니다.

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 날짜가 필요하며spongemoreutils 패키지에서 동일한 파일에 다시 쓰기

awk -v ago="$(date -d '30 days ago' '+%F %T')" '
    $1 == "#" && $2" "$3 < ago {getline; next}
    {print}
' file | sponge file

관련 정보