AWK命令意外修改IP参数的问题排查与解决求助
解决awk中IP被错误修改的问题
这个问题的根源在于你直接在awk的脚本字符串里插入了shell变量$ip,导致shell先把$ip展开成10.165.6.90,然后awk把这个展开后的内容当成了代码的一部分,而不是一个完整的字符串常量。
具体来说,你的原命令展开后,awk实际执行的是:
print 10.165.6.90 ";" $10 ";" $15
在awk里,点号是算术运算符(小数点)或者字段引用的符号,它不会把10.165.6.90当成一个完整的字符串。这就导致awk错误地解析了这个IP,把它拆成了多个部分,还和后面的$10、$15的数值意外拼接/计算,最终输出了变形的IP地址。
两种可靠的解决方案:
方案1:用awk的-v选项传递变量(推荐)
这个方法是把shell变量$ip作为awk的内部变量传递进去,这样awk会把它当作字符串处理,不会解析成代码:
grep STRING text.txt | awk -v ip="$ip" -F'[. ="]' '{print ip ";" $10 ";" $15}'
(顺便去掉了多余的cat,grep可以直接读取文件内容)
方案2:转义引号,把IP作为字符串常量传入
如果你不想用-v选项,可以通过引号嵌套把IP用双引号括起来,让awk识别为字符串:
grep STRING text.txt | awk -F'[. ="]' '{print "'"$ip"'" ";" $10 ";" $15}'
这里的'"$ip"'是shell引号的技巧:先关闭awk的单引号,用双引号包裹$ip让shell展开,再重新开启awk的单引号,最终awk看到的是print "10.165.6.90" ";" $10 ";" $15。
这两种方法都能保证IP地址被当作完整的字符串输出,不会再出现变形的问题。
内容的提问来源于stack exchange,提问作者Eyvz
相关产品推荐
相关产品推荐

