2016-04-29 6 views
1

система: CentOS 6,5дополнительные нулевые символы, когда SED отредактировать файл в месте, которое под wirting

Bash Версия: 4.1.2

GNU СЭД версия: 4.2.1

1 .create файл, который под письмом:

$ 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.use 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.my вопрос:

, когда СЭД дела с файлом 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

Что такое 'СЕПГ -c -i --follow-симлинка -e 'ж/разработчик/STDOUT' -e 'd' access_test.log> Foo' должен делать ? – fedorqui

+0

@fedorqui печатать строки в stdout и удалять их на месте, поэтому номер inode файла не будет изменен sed, а его содержимое будет сохранено в другом файле, его размер уменьшится. – lxf1992521

+1

Что такое опция '-c', у моего sed нет этого? – anubhava

ответ

1

, когда СЭД дела с файлом, который находится под письменной формой, она уезжала много нуля (\ 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 & 
+0

Просто замечательно, да, это так; режим журнала nginx - «>» или «>>»? Я делаю это для aviod sed -USR1 сигнала для nginx, поэтому могу ли я использовать метод sed для logrotate nginx? – lxf1992521

+0

Да, я думаю, вы тоже это можете сделать. – anubhava

+1

Большое спасибо, он работает после теста с доступом nginx access.log. еще раз спасибо !!! – lxf1992521