摆脱模式linux匹配的行尾

时间:2016-03-06 19:56:20

标签: awk sed

我正在尝试从配置中获取IP地址列表,我以格式:*.*.*.*:*接收它们,其中最后一个字段是已建立连接的端口号。 我怎样才能摆脱端口数字? 这是我现在所做的路线:

ss -ta | tail -n +2 |awk  '{print $4}' | sort -u

我理解我需要在awk和sort之间使用sed作为管道来删除冒号之后的部分,但我不知道如何以正确的方式执行此操作。

ss -ta 返回以下内容:

State      Recv-Q Send-Q Local Address:Port                 Peer Address:Port                
LISTEN     0      128            *:ssh                          *:*                    
LISTEN     0      100    127.0.0.1:smtp                         *:*                    
CLOSE-WAIT 32     0      192.168.1.7:48474                104.18.35.72:https                
CLOSE-WAIT 32     0      192.168.1.7:52879                104.18.34.72:https                
CLOSE-WAIT 1      0      192.168.1.7:38492                82.80.211.109:http                 
LISTEN     0      128           :::ssh                         :::*                    
LISTEN     0      100          ::1:smtp                        :::*                    
ESTAB      0      52     fe80::a00:27ff:fead:6df2%enp0s3:ssh               fe80::e1

这是我命令的输出:

> 127.0.0.1:smtp

> 192.168.1.7:38492

> 192.168.1.7:48474

> 192.168.1.7:52879

>  ::1:smtp 

> fe80::a00:27ff:fead:6df2%enp0s3:ssh

> :::ssh

> *:ssh

所需的输出是:

> 127.0.0.1

> 192.168.1.7

感谢

3 个答案:

答案 0 :(得分:4)

没有可测试的样本输入和预期输出,这是一个猜测,但听起来就像你需要的只是

ss -ta | awk '{$0=$4;sub(/:[^:]+$/,"")} NR>1 && !seen[$0]++'

e.g。使用cat file代替ss ta将预期输入传递给命令:

$ cat file | awk '{$0=$4;sub(/:[^:]+$/,"")} NR>1 && !seen[$0]++'
*
127.0.0.1
192.168.1.7
::
::1
fe80::a00:27ff:fead:6df2%enp0s3

但如果我们查看您发布的预期输出,那么您真正想要的更像是:

$ cat file | awk '{$0=$4;sub(/:[^:]+$/,"")} NR>1 && /[0-9]+(\.[0-9]+){3}/ && !seen[$0]++'
127.0.0.1
192.168.1.7

答案 1 :(得分:1)

您可以使用gnu awk删除端口,在原始管道中使用awk '{print gensub(/:.*/,"","g",$4)}'

答案 2 :(得分:0)

只需使用正则表达式删除:之后的所有内容,即可使用:

ss -ta | tail -n +2 |awk  '{print $4}' | sort -u | sed 's/:.*$//g' | uniq

或者您甚至可以将awk:一起用作字段分隔符:

ss -ta | tail -n +2 |awk  '{print $4}' | sort -u | awk -F : '{print $1}' | uniq

或使用:

的分隔符剪切
ss -ta | tail -n +2 |awk  '{print $4}' | sort -u | cut -d : -f 1 | uniq