我有一个像这样的变量
master='172.21.154.37 172.21.250.94 172.21.251.93 172.21.250.94' 我需要检查文件中的第一列和第二列是否都与变量匹配。以下是示例,第二行,172.21.154.37 可以在变量 $master 中找到,而 172.21.250.94 也可以在 $master 中找到
172.21.154.40 172.21.254.25
172.21.154.37 172.21.250.94
172.21.250.93 172.21.254.24
awk '$1 /'$master'/ {print $0 }' /tmp/newip.txt but there is an escapte issue
awk '$1 /172.21.154.37' 172.21.250.94 172.21.251.93 '172.21.250.94/ {打印 $0 }' /tmp/newip.txt
问题已解决,谢谢
无论转义问题如何,匹配的语法都是错误的。
awk '$1 /172.21.154.37'
如果字段 1 非空,则始终为真:您需要一个像 这样的运算符~
,或者一个像 这样的函数index()
。无论如何,匹配包含特殊字符的文本.
是不明智的。index()
是纯文本搜索。将 shell 变量注入脚本的正确方法
awk
是使用 -v 选项传递值。将 IP 列表拆分为 awk 数组并使用
in
运算符通常比模式搜索更简洁。您的双重测试将如下所示:($1 in List) && ($2 in List)
。请参阅how-do-i-use-shell-variables-in-an-awk-script以了解如何将 shell 变量的值传递给 awk 脚本。
正如@Paul_Pedant在他们的回答中提到的那样,从你的 shell 变量创建一个 awk 数组(
targets[]
如下)master
,然后使用它对in
每个 IP 地址进行哈希查找是最有效和最强大的方法,例如使用任何 awk: