2

我有一个 ports.txt 文件,其中包含以下数据“IP 地址、本地端口、远程端口和协议”。这是文件的样子:

1.1.1.1-22-2222-tcp
2.2.2.2-3000-4321-udp
3.3.3.3-80-8080-tcp
4.4.4.4-443-4443-tcp

我想做的是使用 SED 通过将 ports.txt 文件中的值放在正确的位置来编辑每一行。

我使用了 ports.txt 文件中的第 1 行作为预期结果的示例:

-A PREROUTING -i eth0 -p tcp -m tcp --dport 2222 -j DNAT --to-destination 1.1.1.1:22

我发现我可以使用这样的循环逐行读取:

while read line; do echo $line; done < ports.txt

但我不知道如何让 SED 提取值并将它们放入所需的格式。

4

4 回答 4

1

下面的解决方案使用echosed和来提取端口、协议和目标tailgrep

对于目的地:我们从末尾删除端口和协议,然后用破折号 ( -) 替换冒号 ( :)。(此外,作为预防措施,会考虑尾随空格)。

对于协议:我们只是删除直到最后的所有内容-,以及任何尾随空格以防万一。

对于端口:我们使用grep查找所有数字序列,-o只给我们匹配的组件,然后我们使用tail -1.

: '
INPUT:
1.1.1.1-22-2222-tcp
2.2.2.2-3000-4321-udp
3.3.3.3-80-8080-tcp
4.4.4.4-443-4443-tcp

OUTPUT:
-A PREROUTING -i eth0 -p tcp -m tcp --dport 2222 -j DNAT --to-destination 1.1.1.1:22
-A PREROUTING -i eth0 -p udp -m udp --dport 4321 -j DNAT --to-destination 2.2.2.2:3000
-A PREROUTING -i eth0 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 3.3.3.3:80
-A PREROUTING -i eth0 -p tcp -m tcp --dport 4443 -j DNAT --to-destination 4.4.4.4:443
'

while read -r line
do
    dest=$(echo "$line" | sed 's/-[^-]*-[^-]*\s*$//;s/-/:/')
    protocol=$(echo "$line" | sed 's/.*-//;s/\s*$//')
    port=$(echo "$line" | grep -oE '[0-9]+' | tail -1)
    echo "-A PREROUTING -i eth0 -p $protocol -m $protocol --dport $port -j DNAT --to-destination $dest"
done < ports.txt
于 2020-12-21T14:34:42.033 回答
1

使用这个 Perl 单行:

perl -F'-' -lane 'my ( $ip_address, $local_port, $remote_port, $protocol ) = @F; print "-A PREROUTING -i eth0 -p tcp -m ${protocol} --dport ${remote_port} -j DNAT --to-destination ${ip_address}:${local_port}";' ports.txt

Perl 单行器使用这些命令行标志:
-e:告诉 Perl 查找内联代码,而不是在文件中。
-n:一次循环输入一行,$_默认情况下将其分配给。
-l: 在执行内联代码之前去除输入行分隔符("\n"默认情况下在 *NIX 上),并在打印时附加它。:在空格或选项中指定的正则表达式上
-a拆分$_为数组。: 拆分为破折号 ( ),而不是空格。@F-F
-F'-'@F-

还请参见
perldoc perlrun::如何执行 Perl 解释器:命令行开关

于 2020-12-21T14:38:10.073 回答
1

使用 sed:

sed -rn 's/(^.*)-(.*)-(.*)-(.*$)/A PREROUTING -i eth0 -p \4 -m \4 --dport \3 -j DNAT --to-destination \1:\2/p' ports.txt

将行拆分为用 - 拆分的各个部分,并用所需格式打印的不同部分(用 \n 指定)替换行。

于 2020-12-21T14:41:55.343 回答
0

使用 awk,将字段分隔符设置为 -,然后以所需格式使用字段进行打印。

awk -F- '{ print "A PREROUTING -i eth0 -p "$4" -m "$4" --dport "$3" -j DNAT --to-destination "$1":"$2 }' ports.txt
于 2020-12-21T14:31:58.250 回答