我有一个模拟运行,并期望它继续至少10个小时。我已经使用
将控制台指向了.txt文件(binary) > out.txt
这个out.txt变得太大了。我不需要这个文件中的很多内容。如何在不损害写入过程的情况下删除此文件的旧部分?在模拟结束时写入的内容对我来说很重要。
答案 0 :(得分:2)
作为评论中提到的Carl
,您无法在主动写入的日志文件中真正执行此操作。但是,如果初始数据与您无关,您可以执行以下操作(但提防您将丢失所有数据)
> out.txt
将来,您可以使用名为logrotate(8)
的实用程序答案 1 :(得分:0)
您可以使用tail
仅存储文件末尾:
# Say you want to save the last 100 lines
your_binary | tail -n 100 > out.txt
这假设输出在某个时刻结束。
答案 2 :(得分:0)
看到你的评论 - 文件现在是10 GB ...尝试使用sed -i减小尺寸以便它可以与其他工具一起使用,如果你想完全删除它那么:>日志文件中。
工具可以处理一个与缓冲区一样大的文件,否则它们应该被流式传输......像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
我认为这两者中的任何一个都会有所帮助。
如果您有其他想法,请告诉我!!
答案 3 :(得分:0)
使用 cat
截断文件
> cat /dev/null > out.txt