我正在尝试从配置中获取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
感谢
答案 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