我有
#!/bin/sh
tcpdump -c 1 -eni any host 100.80.1.252 > tcpd.txt
sleep 2
awk 'NR==1{print $9}' tcpd.txt > ip.txt
sleep 2
cat ip.txt
输出为 100.70.62.33
现在我想将 file1 中的每个 100.70.xx 地址更改为存储在 ip.txt 文件中的地址
我想要实现的目标:
我有一个 sh 脚本正在调用一些 iptables 规则(这是我要修改 100.70.xx IP 的文件)
cat set_direct_routing_server_2.sh
#!/bin/sh
iptables -t nat -F
iptables -t nat -A PREROUTING --source 192.168.219.2 --destination 192.168.219.4/30 -j DNAT --to-destination 100.70.62.21
iptables -t nat -A PREROUTING --source 100.70.62.21 --destination 100.80.1.252 -j DNAT --to-destination 192.168.219.2
iptables -t nat -A POSTROUTING --source 100.70.62.21 -j SNAT --to-source 192.168.219.6
ipstables -t nat -L
master.sh
是我在第一篇文章中谈论的脚本:
#!/bin/sh
tcpdump -c 1 -eni any host 100.80.1.252 > tcpd.txt
sleep 2
awk 'NR==1{print $9}' tcpd.txt > ip.txt
sleep 2
cat ip.txt
sleep 2
sed -i "s/100\.70\.[0-9]\{1,3\}\.[0-9]\{1,3\}/$(<ip.txt)/g" set_direct_routing_server_2.sh
cat set_direct_routing_server_2.sh
当我调用 master.sh 时,我有以下输出。
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
侦听任何链接类型 LINUX_SLL(Linux 煮熟),捕获大小 262144 字节 捕获 1 个数据包 过滤器收到 2 个数据包 内核丢弃 0 个数据包 100.70.62.33 #!/bin/sh iptables -t nat -F
iptables -t nat -A PREROUTING --source 192.168.219.2 --destination 192.168.219.4/30 -j DNAT --to-destination
iptables -t nat -A PREROUTING --source --destination 100.80.1.252 -j DNAT --to-destination 192.168.219.2
iptables -t nat -A POSTROUTING --source -j SNAT --to-source 192.168.219.6
ipstables -t nat -L
如您所见,100.70.xx 地址仅被删除
答案1
s=$(cat ip.txt)
awk -v s="$s" '{gsub(/100.70.[0-9].{1,3}.[0-9]/, s)}1' file.txt
s=$(cat ip.txt)
在这个变量中我存储了子 shell 的输出
-v s="$s"
这里 -v
接收一个本地和全局的 shell 变量。在这种情况下和本地。
gsub
代表全球替代。它取代了所有出现的情况
/100.70.[0-9].{1,3}.[0-9]/
aki 正则表达式匹配所有ip100.70. *
, s
这个变量具有我们在开始时创建的子 shell 的值,并通过 标志来获取它-v
,awk
此时它将打印它的值。
1
被视为真实,因此等同于打印。
答案2
如果您不介意 IP 地址正则表达式有点宽松,您可以使用sed
:
sed "s/100\.70\.[0-9]\{1,3\}\.[0-9]\{1,3\}/$(<ip.txt)/g" < file1 > output
或者,使用sed
支持-i
:
sed -i "s/100\.70\.[0-9]\{1,3\}\.[0-9]\{1,3\}/$(<ip.txt)/g" file1
匹配“100.70.xx”地址的正则表达式将匹配有效的 IP 地址以及无效的 IP 地址,例如:100.70.900.678
,[0-9]\{1,3\}
简单地说就是匹配一位到三位数字。
替换文本是通过特殊的命令替换 ( ) 在双引号内完成的,$(< filename)
该命令仅读取文件的内容ip.txt
。
该g
标志告诉 sed 替换每行上的每个匹配实例。如果每行只有一个 IP 地址,则不需要该g
标志。