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)

Ответить