&引用;sed/awk“;bash脚本中的值赋值

&引用;sed/awk“;bash脚本中的值赋值,bash,awk,sed,scripting,Bash,Awk,Sed,Scripting,我有一个文件“IP”,其中包含被阻止的不同子网IP地址的数量,我想将子网的最后八位数字更改为1.1.1.5到1.1.0/24。我写了剧本。问题在于awkcommand out没有分配给任何变量 例如: sed "s/139.196.8.79/139.196.8.0\/24/g" ip |a=$(awk -F. '{print $4}') 但当我运行awk-F.{print S4}'时,它返回输出,但不给变量赋值 提前感谢。不确定您的预期输出,但。。。看看上面的例子,也许你在寻找这样的东西:

我有一个文件“IP”,其中包含被阻止的不同子网IP地址的数量,我想将子网的最后八位数字更改为
1.1.1.5
1.1.0/24
。我写了剧本。问题在于
awk
command out没有分配给任何变量

例如:

sed  "s/139.196.8.79/139.196.8.0\/24/g" ip |a=$(awk -F. '{print $4}')
但当我运行
awk-F.{print S4}'
时,它返回输出,但不给变量赋值


提前感谢。

不确定您的预期输出,但。。。看看上面的例子,也许你在寻找这样的东西:

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

不确定您的预期输出,但。。。看看上面的例子,也许你在寻找这样的东西:

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

你想写的是:

a="$(sed  "s/139.196.8.79/139.196.8.0\/24/g" ip | awk -F. '{print $4}' )"
但是在使用awk时,您需要转义RE元字符(
s),并且不需要sed:

a="$(awk -F. '{gsub(/139\.196\.8\.79/,"139.196.8.0/24"); print $4}' ip)"
以上内容未经测试,可能是错误的,也可能不是最佳方法,因为您没有在问题中提供任何示例输入和预期输出


请注意,如果您的数据中可能出现类似
139.196.8.790
的IP地址,但同样没有示例输入和预期输出,则上述内容实际上应该使用单词边界。…

您试图编写的是:

a="$(sed  "s/139.196.8.79/139.196.8.0\/24/g" ip | awk -F. '{print $4}' )"
但是在使用awk时,您需要转义RE元字符(
s),并且不需要sed:

a="$(awk -F. '{gsub(/139\.196\.8\.79/,"139.196.8.0/24"); print $4}' ip)"
以上内容未经测试,可能是错误的,也可能不是最佳方法,因为您没有在问题中提供任何示例输入和预期输出


请注意,如果您的数据中可能出现类似
139.196.8.790
的IP地址,但同样没有样本输入和预期输出,则上面应该使用单词边界。…

管道创建子进程。这意味着您将在子shell中创建变量,该变量在创建之后立即被丢弃。要访问变量,必须将命令分组到大括号中:

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

要使用
a
执行的所有操作都必须在已定义
a
的子shell中完成。

管道创建子进程。这意味着您将在子shell中创建变量,该变量在创建之后立即被丢弃。要访问变量,必须将命令分组到大括号中:

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

您想使用
a
执行的所有操作都必须在子shell中完成,其中定义了
a

使用预期输出显示示例输入使用预期输出显示示例输入将像
6213951962837926
这样的随机数字字符串转换为
62139.196.8.0/2426
。你必须跳出
s。谢谢..是的,这是我所期望的..但我想在这个脚本中使用“for loop”,并希望从“ip”文件中获取每个ip地址,并将其用作模式,并使用awk获取其八进制数,最后用子网0替换最后一个八进制数。/24。谢谢你的提示response@EchoQ听起来您的做法是错误的,并计划在shell循环中多次调用各种工具。阅读Arnold Robbins的《有效的Awk编程》,第四版。这将把像
6213951962837926
这样的随机数字字符串转换成
62139.196.8.0/2426
。你必须跳出
s。谢谢..是的,这是我所期望的..但我想在这个脚本中使用“for loop”,并希望从“ip”文件中获取每个ip地址,并将其用作模式,并使用awk获取其八进制数,最后用子网0替换最后一个八进制数。/24。谢谢你的提示response@EchoQ听起来您的做法是错误的,并计划在shell循环中多次调用各种工具。请阅读Arnold Robbins的《有效的Awk编程》第四版。我将测试您的所有建议并更新。谢谢大家。我将测试您的所有建议并更新。谢谢大家