2016-02-09 101 views
0

我有一个文件“IP”,其中包含不同的子网IP地址数,我想将子网的最后八进制数字改为1.1.1.51.1.1.0/24。我写了剧本。问题是awk命令没有分配给任何变量。bash脚本中的“sed/awk”值分配

例子:

sed "s/139.196.8.79/139.196.8.0\/24/g" ip |a=$(awk -F. '{print $4}') 

但是当我运行awk -F. '{print S4}',它返回的输出,但是不分配值的变量。

在此先感谢。

+3

用预期输出显示您的样本输入 – anubhava

回答

2

不知道你的预期产量,但...看这里你上面的例子,也许,你正在寻找的东西是这样的:

$ a=$(sed "s/139.196.8.79/139.196.8.0\/24/g" ip | awk -F. '{print $4}') 
$ echo $a 
0/24 
+1

这会将像6213951962837926这样的随机数字串变换成62139.196.8.0/2426。你必须逃避''。 –

+0

谢谢..是啊,这是我所期待的..但我想在这个脚本中使用“for循环”,并希望从“IP”文件获得每个IP地址,并将其用作模式,并使用awk打破它的八进制,并最终替换最后的八进制与子网0./24。感谢所有的及时响应 –

+0

@EchoQ听起来像你正在接近这个错误的方式,并计划在一个shell循环内多次调用各种工具。请阅读http://unix.stackexchange.com/q/169716/133219和Arnold Robbins编写的“有效的Awk编程”第4版。 –

1

你试图写的是:

a="$(sed "s/139.196.8.79/139.196.8.0\/24/g" ip | awk -F. '{print $4}')" 

,但你需要躲避RE元字符(. S),当你使用AWK你不需要SED:

a="$(awk -F. '{gsub(/139\.196\.8\.79/,"139.196.8.0/24"); print $4}' ip)" 

以上内容未经测试,可能是错误的或不是最佳方法,因为您未在问题中提供任何示例输入和预期输出。

注意上面确实应该使用单词边界,如果像139.196.8.790的IP地址可能会出现在你的数据,但同样没有样品的输入和预期的输出....

0

的管道建立一个子进程。这意味着你在一个子shell中创建了这个变量,这个变量在之后被丢弃。为了访问变量,你必须将你的命令到大括号:你想与a

sed "s/139.196.8.79/139.196.8.0\/24/g" ip | { 
    a=$(awk -F. '{print $4}') 
    echo $a 
} 

一切都必须在子壳,其中a已经定义完成。

+0

我会测试你的所有建议,并会更新。感谢每个人 –