将命令的结果传递给SED

时间:2015-05-21 23:43:06

标签: shell unix awk sed command

我想要执行以下操作,获取服务器的主机IP,然后使用此值替换配置文件中的虚拟值。

对于第1步获取服务器ip,我打电话:

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

对于步骤2来替换文件中的虚拟值,我会这样做:

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

我们的想法是将这些步骤合并到一个unix命令中,而不使用任何shell脚本。

对此的任何帮助将不胜感激 罗布

2 个答案:

答案 0 :(得分:3)

你几乎就在那里 - 只需将两个命令嵌套在一起:

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

请注意,您需要删除s///g周围的单引号,并将其放在dummyvalue周围。否则bash不会尝试解释内部命令。

答案 1 :(得分:1)

使用awk时,您不需要一系列管道命令。只需在一个awk命令中执行此操作即可。您没有显示任何样本输入和预期输出,因此这显然未经测试,但如果不完全正确,您将接近所需:

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

以上使用gawk 4. *代表-i inplacenextfile,其他代码就是这样做:

hostname -I |
awk 'NR==FNR{if (FNR==1) val=$1; next} {gsub(/dummyvalue/,val)} 1' - filename > tmp && mv tmp filename