代码之家  ›  专栏  ›  技术社区  ›  Giancarlo D

在IPv4地址匹配后使用SED删除行尾的冒号

  •  1
  • Giancarlo D  · 技术社区  · 3 年前

    脚本匹配文件中的私有IP并打印第3列。

    第3列中的值可以是IPv4或IPv6。IPv4地址后面跟着“:PORT”。我可以跑步 sed 's/:.*//g' 但如果打印,这也会影响IPv6地址。同样,如果我使用多个FS[,:],它将打印IPv4,但只打印IPv6地址的第一个八位字节。

    我的解决方案是从IPv4地址的末尾剥离“:PORT”

    $ cat openvpn-status.log
    10.13.0.27,ijegunbead-4,74.201.72.222:49911,2022-06-26 02:55:26
    10.13.0.23,biddy-h-1,2803:4600:1111:17ec:a821:1a8:53ca:760d,2022-06-26 02:55:28
    

    我在一个while循环中运行这个,一个周期dst将 == 10.13.0.27 ,下一个 == 10.13.0.23

    dst1=$(egrep -w ^$dst /etc/openvpn/openvpn-status.log | awk -F'[,:]' '{print $3}')
    

    结果:

    74.201.72.222
    2803
    

    预期结果:

    74.201.72.222
    2803:4600:1111:17ec:a821:1a8:53ca:760d
    

    我试过了,但没有成功

    dst1=$(egrep -w ^$dst /etc/openvpn/openvpn-status.log | awk -F',' '{print $3}') | sed 's/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:*//g'
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   tink    3 年前

    这对你有用吗?

    $ awk -F, '{if($3~/\./){gsub(/:.*$/,"",$3)};print $3}' openvpn-status.log
    74.201.72.222
    2803:4600:1111:17ec:a821:1a8:53ca:760d
    
        2
  •  0
  •   Daweo    3 年前

    解决方案采用 sed 问题标题中要求的解决方案,让 file.txt 内容be

    10.13.0.27,ijegunbead-4,74.201.72.222:49911,2022-06-26 02:55:26
    10.13.0.23,biddy-h-1,2803:4600:1111:17ec:a821:1a8:53ca:760d,2022-06-26 02:55:28
    

    然后

    cut --delimiter=',' --field=3 file.txt | sed '/^[0-9]*[.]/ s/:[0-9]*$//'
    

    提供输出

    74.201.72.222
    2803:4600:1111:17ec:a821:1a8:53ca:760d
    

    说明:使用cut从,-分隔的文件中获取第三个字段,然后对于以零或多个数字开头并后跟文字点替换的每一行,以及与行末相邻的零或多个数字的空字符串,即删除它

    (在GNU sed 4.7中测试)

        3
  •  0
  •   sseLtaH    3 年前

    使用 sed

    $ sed 's/\([^,]*,\)\{2\}\([^,]*\).*/\2/;/\./s/:.*//' input_file
    74.201.72.222
    2803:4600:1111:17ec:a821:1a8:53ca:760d