On 18.01.2013 19:11, Timofey Andreewski wrote:
On 01/18/2013 02:58 PM, Timofey Andreewski wrote:
awk -v inIP=$1 '{gsub("EXTIP1.*", "EXTIP1=\""inIP"\"", $0); print >
FILENAME}' test
Тут корень проблемы в print > FILENAME
Ты построчно читаешь файл и туже в него пишешь.
Пиши в другой файл. Я проверил - работает и на строке
22222222222222kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
В файле будет:
EXTIP1="22222222222222kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
xxxxxxxxxxx
bbbbbbbbbbb
ccccccccccc
xxxxxxxxxxx
Это идеологически не правильно: весь модифицированный поток надо сохранять
отдельно, и тогда некоректные выходы программы не повлекут за собой
нарушения целостности исходных данных. Модифицирующий код отработает,
проверяешь код завершения, и если OK, то заменяешь исходный файл с
данными, временным.
Я сходу так сделал :
awk -v inIP=$1 '{ if (NR==1) OFILE=FILENAME".bak"; gsub("EXTIP1.*",
"EXTIP1=\""inIP"\"", $0); print > OFILE; }' test && mv test.bak test
Да проблем-то не в этом, а в том, что если я последовательно запускаю:
./awtest 13424
./awtest 13426
./awtest 13427
./awtest 13428
./awtest 13429
./awtest 13430
все отлично работает
а вот как только я после этого запускаю:
./awtest 134301
то скрипт тут же зависает в непреревном цикле. Откуда такое поведение-то?
Почему удлиление строки-то так действует?
Правильный ответ: так делать нельзя, и нельзя такого хотеть. Следует вбить
себе в голову, что делать надо правильно, и не пытаться получить
корректность от хождения по граблям.
Объяснение: awk более длинной строкой перезатирает символ перевода строки в
исходном файле, и читает на следующей итерации более длинную ту же строку
(результат слепливания), заменяет её на такую, которая подпадает под тот же
шаблон в виду повторения подстроки EXTIP1, снова заменяет, и т.д.
--
Vadim Goncharov <vgoncha...@nic.ru> RU-Center
NET Department http://www.nic.ru
NET-SYS Group phone:+7(495)737-7646 (ext.4019)