提取方括号内的值

时间:2017-03-09 14:00:55

标签: python unix awk

我有一个文件测试文件,其中包含一组服务器名称。

app-server-l11[2-5].test.com
server-l34[5-8].test.com
dd-server-l[2-4].test.com

请帮助您将输出结果如下。

app-server-l112.test.com
app-server-l113.test.com
app-server-l114.test.com
app-server-l115.test.com
server-l345.test.com
server-l346.test.com
server-l347.test.com
server-l348.test.com
dd-server-l2.test.com
dd-server-l3.test.com
dd-server-l4.test.com

7 个答案:

答案 0 :(得分:2)

使用GNU awk为第3个arg匹配():

$ awk 'match($0,/(.*)\[([0-9]+)-([0-9]+)\](.*)/,a){for (i=a[2]; i<=a[3]; i++) print a[1] i a[4]}' file
app-server-l112.test.com
app-server-l113.test.com
app-server-l114.test.com
app-server-l115.test.com
server-l345.test.com
server-l346.test.com
server-l347.test.com
server-l348.test.com
dd-server-l2.test.com
dd-server-l3.test.com
dd-server-l4.test.com

答案 1 :(得分:1)

最糟糕和最丑陋的例子:

var='app-server-l11[2-5].test.com'
for i in range(int(var[(var.find('[') +1)]), int(var[(var.find("]") - 1)])+1):
     print 'app-server-l11' + str(i) + '.test.com'

发挥你的想象力!

答案 2 :(得分:1)

ser_nm = ['app-server-l11[2-5].test.com','server-134[5-8].test.com','dd-server-[2-4].test.com']

for nm in ser_nm:
    for i in range(int(nm[nm.find('[')+1 : nm.find('-',(nm.find('[')+1))]), int(nm[nm.find('-',(nm.find('[')+1))+1:nm.find(']')  ] )+1):
        print(nm[:nm.find('[')] + str(i) + nm[nm.find(']')+1:])

这也将处理服务器名称如下的情况: &#39;服务器-134 [52-823] .test.com&#39;

答案 3 :(得分:1)

在GNU awk中:

$ awk -F"[][]" '{split($2,a,"-"); for(i=a[1];i<=a[2];i++) print $1 i $3}' file
app-server-l112.test.com
app-server-l113.test.com
app-server-l114.test.com
app-server-l115.test.com
server-l345.test.com
server-l346.test.com
server-l347.test.com
server-l348.test.com
dd-server-l2.test.com
dd-server-l3.test.com
dd-server-l4.test.com
  • 使用[
  • ]FS拆分为字段
  • 使用split获取范围开始(a[1])和结束(a[2]
  • 使用for和输出
  • 迭代范围

没有检查是否有范围。它可以通过以下内容实现:print (NF==3 ? $1 i $3 : $1 )

答案 4 :(得分:0)

不是最好的解决方案,但它有效......

inp = open('input.txt', 'r+').read()
print(inp)
result= ''
for i in inp.split('\n'):
    if len(i) > 1:
        print(repr(i))
        f1 = i.find('[')
        f2 = i.find(']')+1
        b1 = i[:f1]
        b2 = i[f2:]
        ins = i[f1:f2]
        ins = ins[1:-1]
        for j in range(int(ins.split("-")[0]),int(ins.split("-")[1])+1):
            result+=b1+str(j)+b2+'\n'

outp = open('output.txt', 'w')
outp.write(result)
outp.close()

答案 5 :(得分:0)

因为这听起来像学校作业,我会相当含糊。

我会使用正则表达式来提取数值范围和其余的地址组件,然后使用循环迭代提取的数值范围来构建每个地址(使用其他捕获的地址组件)。

因为已经超过一周了:

    import re

    inputs = [ "app-server-l11[2-5].test.com", "server-l34[5-8].test.com", "dd-server-l[2-4].test.com" ]

    pattern = r"\s*(?P<subdomain>[a-zA-Z0-9-_.]+)\[(?P<range_start>\d+)-(?P<range_end>\d+)\](?P<domain>\S+)"

    expr = re.compile( pattern )

    def expand_domain( domain ):
        mo = expr.match( domain )
        if mo is not None:
            groups = mo.groupdict()
            subdomain = groups[ "subdomain" ]
            domain = groups[ "domain" ]
            range_start = int( groups[ "range_start" ] )
            range_end = int( groups[ "range_end" ] )
            result = [ "{}{:d}{}".format( subdomain, index, domain ) for index in range( range_start, range_end + 1 ) ]
            return result
        else:
            raise ValueError( "'{}' does not match the expected input.".format( domain ) )

    for domain in inputs:
        print( "'{}':".format( domain ) )
        for exp_dom in expand_domain( domain ):
            print( "--> {}".format( exp_dom ) )

答案 6 :(得分:0)

您可以使用以下命令获取所需的输出,而无需任何复杂的语句。

awk -f test.awk file.txt

test.awk必须包含以下行:

{
    if(a=match($0,"\\["))
    {
            start=strtonum(substr($0,a+1,1));
            end=strtonum(substr($0,a+3,1));
            copy=$0;
            for(i=start;i<=end;i++)
            {
                    sub("\\[[0-9]{1,}-[0-9]{1,}\\]",i,copy);
                    print copy;
                    copy = $0;
            }
    }
    else
    {
            print $0;
    }
}

file.txt包含您的输入文件,如下所示:

app-server-l11[2-5].test.com
server-l34[5-8].test.com
dd-server-l[2-4].test.com

输出:

app-server-l112.test.com
app-server-l113.test.com
app-server-l114.test.com
app-server-l115.test.com
server-l345.test.com
server-l346.test.com
server-l347.test.com
server-l348.test.com
dd-server-l2.test.com
dd-server-l3.test.com
dd-server-l4.test.com