我通常不做这种事情,所以我必须问一下。我如何编写一个脚本来检查日志文件,假设它的名称为 log.txt,从中抓取除前 100 000 行之外的所有内容到新的 log.txt 文件中并删除旧的 log.txt?它也必须每月运行一次。
到目前为止,凭借我零编码知识,我只设法编写了一个脚本,每月删除一次 log.txt(自动生成新的脚本),但我真的很想保留除下面提到的最旧的 100 000 个条目之外的数据。
这是旧脚本
#!/bin/sh
find /mnt/usb_storage/ -type f -name "log.txt" -exec rm -r {} \;
我如何实现它:
# cd /privRoot
# chmod 755 deleteLogMonthly.sh
# crontab -e
59 23 1 * * deleteLogMonthly.sh
答案1
你正在尝试重新发明轮子。
Logrotate 可以高效地完成这一任务:
https://www.linode.com/docs/uptime/logs/use-logrotate-to-manage-log-files
http://www.rackspace.com/knowledge_center/article/understanding-logrotate-utility
您不需要指定 100K 行,只需给它一个时间间隔,它就会从该时间段开始写入新日志文件,并保留旧日志文件。
如果由于某些奇怪的原因,logrotate 不是一个真正的选择,请查看 Cronolog:
有没有可以替代 logrotate 的 apache 日志?
http://linux.die.net/man/1/cronolog
或者确实手动编写一个像这样的 bash 脚本:
这仍然基于天数,但您可以在其中添加一些行计数。
答案2
在您的 logrotate 配置中添加以下内容(/etc/logrotate.d/ 下的新文件)
/mnt/usb_storage/log.txt {
rotate 5 # Change this to number of files you need to preserve
monthly
prerotate
/usr/bin/sed -e '1,100000d' < /mnt/usb_storage/log.txt
endscript
postrotate
<some another action>
endscript
}
您可以使用以下方法进行验证logrotate -d /etc/logrotate.d/mylogrotate.conf
(假设您已经创建了该文件)
答案3
查找“logrotate”的手册页或通过 shell 脚本自己制作。这没有什么神奇的。如果你知道如何手工制作,只需将其全部放在一个 txt 文件中就可以了。
还请查看工具“tail”的手册页。它旨在显示“尾部”或更准确地说是文件的最新 X 行。“man tail”为您提供有关如何使用它的更多信息。