sh 脚本将文件中的 IP 地址替换为存储在文本文件中的 IP 地址

sh 脚本将文件中的 IP 地址替换为存储在文本文件中的 IP 地址

我有

#!/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 的值,并通过 标志来获取它-vawk此时它将打印它的值。

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标志。

相关内容