我正在运行一个模拟,并希望它至少再运行 10 个小时。我已使用以下命令将控制台输出到 .txt 文件
(binary) > out.txt
这个 out.txt 变得太大了。我不需要这个文件中有很多内容。如何在不损害写入过程的情况下删除该文件的旧部分?模拟结束时要写的内容对我来说很重要。
我正在运行一个模拟,并希望它至少再运行 10 个小时。我已使用以下命令将控制台输出到 .txt 文件
(binary) > out.txt
这个 out.txt 变得太大了。我不需要这个文件中有很多内容。如何在不损害写入过程的情况下删除该文件的旧部分?模拟结束时要写的内容对我来说很重要。
正如Carl
评论中所提到的,您不能真正在主动编写的日志文件上执行此操作。但是,如果初始数据与您无关,您可以执行以下操作(但请注意,您将丢失所有数据)
> out.txt
将来,您可以使用名为logrotate(8)的实用程序
您可以使用tail
仅存储文件的结尾:
# Say you want to save the last 100 lines
your_binary | tail -n 100 > out.txt
这假设输出在某个点结束。
看到您的评论 - 该文件现在是 10 GB ...尝试使用 sed -i 减小大小,以便它可以与其他工具一起使用,如果您想完全擦除它,那么:> logfile。
工具可以处理与其缓冲区一样大的文件,否则它们应该被流式传输.....像 split 之类的东西不适用于 4 GB 文件,不知道他们是否对此进行了代码调整,已经很久了因为我不得不处理这么大的文件。
两个建议:
我可以想到一些方法,比如使用 split ...。但几乎所有方法都涉及从日志中创建一个单独的文件(简化版本)并重命名或重定向到该文件。
使用 split 将日志拆分为更小的日志(split -l 100 ...),并将程序输出重定向到最近使用 ls -1 找到的最后一个日志。这似乎工作正常。
我还尝试了第二种方法来编辑/截断同一文件中的前 10 行......
Kaizen ~/shell_prac
$ cat zcntr.sh
## test truncate a log file
##set -xv
:> zcntr.log ;
## fxn
cntr_log()
{
limit=$1 ;
start=0 ;
while [ $start -lt $limit ]
do
echo "count is $start" >> zcntr.log ; ## generate a continuous log
start=$(($start + 1));
sleep 1;
cnt=$(($start % 10)) ;
if [ $cnt -eq 0 ] ## check to truncate the top 10 lines using sed
then
echo "truncate at $start " >> zcntr.log ;
sed -i "1,10d" zcntr.log ;
fi
done ;
}
## main cntrlr
echo "enter a limit" ;
read lmt ;
cntr_log $lmt ;
这似乎有效,我用计数器对其进行了测试以打印到值 25 输出:
Kaizen ~/shell_prac
$ cat zcntr.log
count is 19
truncate at 20
count is 20
count is 21
count is 22
count is 23
count is 24
我认为两者中的任何一个都会有所帮助。
让我知道您是否还有其他想法!
截断文件cat
> cat /dev/null > out.txt