3

我正在运行一个模拟,并希望它至少再运行 10 个小时。我已使用以下命令将控制台输出到 .txt 文件

(binary) > out.txt

这个 out.txt 变得太大了。我不需要这个文件中有很多内容。如何在不损害写入过程的情况下删除该文件的旧部分?模拟结束时要写的内容对我来说很重要。

4

4 回答 4

2

正如Carl评论中所提到的,您不能真正在主动编写的日志文件上执行此操作。但是,如果初始数据与您无关,您可以执行以下操作(但请注意,您将丢失所有数据)

> out.txt

将来,您可以使用名为logrotate(8)的实用程序

于 2013-05-28T03:27:31.323 回答
0

您可以使用tail仅存储文件的结尾:

# Say you want to save the last 100 lines
your_binary | tail -n 100 > out.txt

这假设输出在某个点结束。

于 2013-05-28T03:19:01.837 回答
0

看到您的评论 - 该文件现在是 10 GB ...尝试使用 sed -i 减小大小,以便它可以与其他工具一起使用,如果您想完全擦除它,那么:> logfile。

工具可以处理与其缓冲区一样大的文件,否则它们应该被流式传输.....像 split 之类的东西不适用于 4 GB 文件,不知道他们是否对此进行了代码调整,已经很久了因为我不得不处理这么大的文件。

两个建议:

1

我可以想到一些方法,比如使用 split ...。但几乎所有方法都涉及从日志中创建一个单独的文件(简化版本)并重命名或重定向到该文件。

使用 split 将日志拆分为更小的日志(split -l 100 ...),并将程序输出重定向到最近使用 ls -1 找到的最后一个日志。这似乎工作正常。

2

我还尝试了第二种方法来编辑/截断同一文件中的前 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

我认为两者中的任何一个都会有所帮助。

让我知道您是否还有其他想法!

于 2013-05-28T06:05:18.443 回答
0

截断文件cat

> cat /dev/null > out.txt
于 2021-01-29T12:57:21.473 回答