2015-05-21 2 views
0

Я хочу сделать следующее: получить IP-адрес моего сервера, а затем использовать это значение, чтобы заменить значение фиктивного файла в файле конфигурации.Передача результата команды SED

Для шага 1, чтобы получить IP-адрес сервера я называю:

hostname -I | head -n1 | awk '{print $1;}' 

На шаге 2, чтобы заменить фиктивное значение в файле я хотел бы сделать:

sed -i 's/dummyvalue/valuefromprevioushostnamecommand/g' filename. 

Идея заключается в том, чтобы объединить этот шаги в одну команду unix без использования каких-либо сценариев оболочки.

Любая помощь по этому вопросу будет весьма признателен Роб

ответ

3

Вы почти там - просто гнездо две команды внутри друг друга:

sed -i s/'dummyvalue'/$(hostname -I | head -n1 | awk '{print $1;}')/g filename 

Обратите внимание, что вам нужно удалить окружающие одинарные кавычки вокруг s///g, и разместили их вокруг dummyvalue. В противном случае bash не будет пытаться интерпретировать внутреннюю команду.

+0

спасибо за быстрый ответ. позвольте мне дать это выстрел. –

+0

работал как шарм, почему я не могу принять ваш ответ? –

+0

Это не удастся странным и замечательным образом, если вывод этой цепочки команд хостов будет содержать любые символы, которые означают что-то в контексте замены sed, например. '/', '&', '\ 1' и т. Д. –

1

Вам не нужна цепочка команд, когда вы используете awk. Просто сделайте это в одной команде awk. Вы не показали пример ввода и ожидаемые результаты, так что это явно не тестировалось, но будет близки к тому, что вам нужно, если не точно:

hostname -I | 
awk -i inplace 'NR==FNR{if (FNR==1) val=$1; nextfile} {gsub(/dummyvalue/,val)} 1' - filename 

Вышеприведенные использует поглазеть 4. * для -i inplace и nextfile с другой awks просто сделайте:

hostname -I | 
awk 'NR==FNR{if (FNR==1) val=$1; next} {gsub(/dummyvalue/,val)} 1' - filename > tmp && mv tmp filename 
Смежные вопросы