Bash 编辑文件并保留最后 500 行

发布于 2024-09-02 13:06:48 字数 182 浏览 5 评论 0原文

我希望创建一个 cron 作业,打开一个目录,循环遍历我创建的所有日志并删除所有行,但保留最后 500 行。

我正在考虑类似于

tail -n 500 filename > 的东西filename

这可行吗?

我也不知道如何在 bash 中循环访问目录。

I am looking to create a cron job that opens a directory loops through all the logs i have created and deletes all lines but keep the last 500 for example.

I was thinking of something along the lines of

tail -n 500 filename > filename

Would this work?

I also not sure how to loop through a directory in bash.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

人心善变 2024-09-09 13:06:48

如果要截断的日志文件当前由某些服务打开,则按照前面的答案使用 mv 将中断这些服务。通过使用 cat 可以轻松克服这个问题:

tail -n 1000 myfile.log > myfile.tmp
cat myfile.tmp > myfile.log

If log file to be truncated is currently open by some services, then using mv as in previous answers will disrupt those services. This can be easily overcome by using cat instead:

tail -n 1000 myfile.log > myfile.tmp
cat myfile.tmp > myfile.log
注定孤独终老 2024-09-09 13:06:48

考虑使用logrotate
它不会执行您想要的操作(删除除最后 500 行之外的所有行),但它可以处理大于特定大小的日志文件(通常通过压缩旧日志文件并在某个时刻删除它们)。应该可以广泛使用。

Think about using logrotate.
It will not do what you want (delete all lines but the last 500), but it can take care of logfiles which are bigger than a certain size (normally by comressing the old ones and deleting them at some point). Should be widely available.

小嗷兮 2024-09-09 13:06:48

在我看来,最简单、最快的方法是使用变量:

LASTDATA=$(tail -n 500 filename)
echo "${LASTDATA}" > filename

In my opinion the easiest and fastest way is using a variable:

LASTDATA=$(tail -n 500 filename)
echo "${LASTDATA}" > filename
喜爱纠缠 2024-09-09 13:06:48
DIR=/path/to/my/dir # log directory
TMP=/tmp/tmp.log # temporary file
for f in `find ${DIR} -type f -depth 1 -name \*.log` ; do
  tail -n 500 $f > /tmp/tmp.log
  mv /tmp/tmp.log $f
done
DIR=/path/to/my/dir # log directory
TMP=/tmp/tmp.log # temporary file
for f in `find ${DIR} -type f -depth 1 -name \*.log` ; do
  tail -n 500 $f > /tmp/tmp.log
  mv /tmp/tmp.log $f
done
不乱于心 2024-09-09 13:06:48

在 bash 中,您循环遍历目录中的文件,例如:

cd target/directory

for filename in *log; do
    echo "Cutting file $filename"
    tail -n 500 $filename > $filename.cut
    mv $filename.cut $filename
done

In bash you loop over files in a directory, e.g. like this:

cd target/directory

for filename in *log; do
    echo "Cutting file $filename"
    tail -n 500 $filename > $filename.cut
    mv $filename.cut $filename
done
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文