tell me how to use sed, awk to delete everything older than 7 days recursively in all files, in all / home / * / * .log folders in files.
The file format is:
2018-12-23 23: 34: 43.358 7 INFO
2019-06-12 12: 33: 43.358 7 INFO
2020-05-12 11: 23: 43.358 7 INFO
2020-09-23 10: 34: 43.358 7 INFO
Answer 1, authority 100%
Important!
The given answer as such is not a solution and it seems to me that there will hardly be a solution that will fit by sed
or awk
.
During the execution of the script, all lines that do not start with the date of the format % Y-% m-% d will be deleted from the logs, i.e. if there is a line for today, then a line without a date and again a line for today, the line without a date will still be deleted.
Also, a large date range can cause a runtime error.
# Variable for specifying a period of time, current day +1, i.e. if 6 is specified, then we get 7 days from today
todate = 6
# Since the variable is appended, it is better to clear it
unset datestr
# Loop for forming a string with dates, for further use in the sed command
for ((i = - $ todate; i & lt; = 0; i ++)); do
if [$ i -eq 0]; then
datestr + = `date -d" $ i day "+ '^% Y-% m-% d'`
else
datestr + = `date -d" $ i day "+ '^% Y-% m-% d \ |'`
fi
done
# We process all files that match the mask, removing everything from them except for lines where at the beginning there will be lines from the date range created in the loop
sed / "$ datestr" / \! d /home/*/*.log
The -i
parameter has been removed in sed, which will overwrite the file, before adding it, it is better to make sure that the command output is correct and does not appear erroneous, the parameter is set immediately after calling sed -i ...
The need to delete logs, as well as optimize storage and more, can be satisfied with the same logrotate
, you can read more details on the Internet or run the command man logrotate
in the terminal.