String Bourne shell:根据多个标准拆分字符串(iptables多端口限制)

String Bourne shell:根据多个标准拆分字符串(iptables多端口限制),string,shell,split,sh,String,Shell,Split,Sh,我正在BourneShell中编写一个例程来命令iptables,它大量使用了multiport参数 iptables最多允许15次引用multiport参数。这些参考可以是单个计数1或范围计数2 我需要以一种可用于iptables多端口的可用方式,断开在单个和多个范围之间混合的一长串端口 e、 g.给出了18个参考、18个单独端口和2个范围的列表: 21,22,23,24,25,26,27,28,29,30:40,60,61,62,63,64,65:70 我试图找到一种方法,将字符串和任何类

我正在BourneShell中编写一个例程来命令iptables,它大量使用了multiport参数

iptables最多允许15次引用multiport参数。这些参考可以是单个计数1或范围计数2

我需要以一种可用于iptables多端口的可用方式,断开在单个和多个范围之间混合的一长串端口

e、 g.给出了18个参考、18个单独端口和2个范围的列表:

21,22,23,24,25,26,27,28,29,30:40,60,61,62,63,64,65:70
我试图找到一种方法,将字符串和任何类似的字符串拆分为最多15个引用集,如本例中的15+3:

21,22,23,24,25,26,27,28,29,30:40,60,61,62,63
64,65:70
诀窍在于:范围不能在不同的行上分割。因此,如果原始输入是:

21,22,23,24,25,26,27,28,29,30:40,60,61,62,63:64,65:70
我需要拆分14+4:

21,22,23,24,25,26,27,28,29,30:40,60,61,62
63:64,65:70

有没有什么聪明的方法可以实现这一点,也许是使用awk?

这里有一个简单的awk脚本,可以在同一行上收集尽可能多的同类项目

awk -v RS=',' -F : '{ gsub(/\n$/, "") }
    NF > 1 { r=(r ? r "," : "") $0;                                                                              
        if (r ~ /([^,]*,){6}/) { print r; r=""; } next }                        
    { s=(s ? s "," : "") $0;                                                    
        if (s ~ /([^,]*,){14}/) { print s; s=""; } }                            
    END { if (r && s) {                                                         
            p = r "," s; if (p !~ /([^,:]*[:,]){15}/) { print p; r=s="" } }     
        if (r) print r ; if (s) print s }'
更改的RS记录分隔符意味着逗号被拆分为新行,在这些记录行中,冒号被视为字段分隔符。然后,我们只需检查输入中是否有两个以上的字段,并在打印一批之前收集多达8对或15个单件

输入

21:22,23,24,25,26,27,28,29,30:40,60,61,62,63,64,65:70
它打印

21:22,30:40,65:70
23,24,25,26,27,28,29,60,61,62,63,64

你可以在这里玩:

这看起来很聪明!还没有测试过它,但是如果我有一行包含8个范围16个引用,它将如何运行?也不是OP的一部分没有必要将各个端口从范围中拆分,我很高兴将它们保持在端口列表提供的相同顺序。输入21:22,23:24,25:26,27:28,29,30:40,60:61,62:63,64:65,70被拆分为21:22,23:24,25:26,27:28,30:40,60:61,62:63,64:65和29,70。如果您有一个很长的端口列表,则此操作无效。试着反对:1:2,3,4,5,6,7,8,9,10:11,12:13,14:15,21,25,44,53,801234434659931194:11971723365840004200:43805730:57396665:6670808800:88991402027000:27050对不起,我试图避免空行而不会使脚本太复杂化。更新为只接受将有一些空行。更好,但仍然有一个问题。如果你给刺喂食:1:2,3,4,5,6,7,8,9,10:11,12:13,14:15,21,25,44,53,801234434659931194:1197172‌3365840004200:43805730:57396665:6670808800:88991402027000:27050空行没有问题!输出中的第二行将有20个元素。根据原始问题,a范围与15限制相比为2