当sed编辑文件时,额外的空字符在wirting下

时间:2016-04-29 06:20:41

标签: linux bash sed centos gnu

  

系统:CentOS 6.5

     

Bash版本:4.1.2

     

GNU sed版本:4.2.1

1.创建正在撰写的文件:

$ while sleep 1; do date +ABCDEFG[%d/%b/%Y\ %H\:%M:%S]ABCDEFG;done > access_test.log 2>/dev/null &
$ tail -n 2 access_test.log
  ABCDEFG[29/Apr/2016 14:08:14]ABCDEFG
  ABCDEFG[29/Apr/2016 14:08:15]ABCDEFG 

2.使用sed来处理它。

$ sed -c -i --follow-symlinks -e 'w /dev/stdout' -e 'd' access_test.log > foo
$ less access_test.log
  "access_test.log" may be a binary file.  See it anyway?
  @^@^@^@^@^@^@^@^@^@^@^@^@....<omit>

3.我的问题是:

当sed处理文件wihch正在编写时,它会留下许多空(\ 0)字符,这些字符就行了。

为什么会这样?我可以避免吗?

来自man sed的注释:

-c, --copy

 use copy instead of rename when shuffling files in -i mode.  While this will avoid breaking links (symbolic
 or hard), the resulting editing operation is not atomic.  This is rarely the  desired  mode;  --follow-sym-
 links is usually enough, and it is both faster and more secure.

1 个答案:

答案 0 :(得分:1)

  

当sed处理正在编写的文件时,它会留下大量的空(\ 0)字符,并将其排成一行。

     

为什么??????

这样做是因为另一个进程(while循环)在写入模式下打开了相同的文件,并且该进程(while循环)正在将数据写入access_test.log之后的上一个文件指针位置。当\0删除此文件中的所有行时,这会在文件开头到当前文件位置的文件中留下空字节(sed)。

  

我可以避免它?????

不是使用>重定向,而应使用>>(追加模式)重定向,其中每次写入access_test.log都将在文件末尾通过将文件指针移动到末尾来完成的文件。

这应该有效:

while sleep 1; do date +ABCDEFG[%d/%b/%Y\ %H\:%M:%S]ABCDEFG;done >> access_test.log 2>/dev/null &