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

时间:2010-05-21 09:11:21

标签: bash logging tail

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

我正在考虑

的内容

tail -n 500 filename > filename

这会有用吗?

我也不确定如何在bash中遍历目录。

5 个答案:

答案 0 :(得分:14)

如果某些服务当前打开了要截断的日志文件,那么在之前的答案中使用mv会中断这些服务。这可以通过使用猫来轻松克服:

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

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

在bash中,你循环遍历目录中的文件,例如像这样:

cd target/directory

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