Awk 摆脱与linux匹配的行尾模式

Awk 摆脱与linux匹配的行尾模式,awk,sed,Awk,Sed,我试图从配置中获取ip地址列表,并以以下格式接收它们:*.*.*.*.*,其中最后一个字段是已建立连接的端口号。 我怎样才能摆脱努梅伯港? 以下是我现在的路线: ss -ta | tail -n +2 |awk '{print $4}' | sort -u 我知道我需要使用sed作为awk和sort之间的管道来移除冒号后的部分,但我不确定如何正确地进行 行ss-ta 返回以下内容: State Recv-Q Send-Q Local Address:Port

我试图从配置中获取ip地址列表,并以以下格式接收它们:
*.*.*.*.*
,其中最后一个字段是已建立连接的端口号。 我怎样才能摆脱努梅伯港? 以下是我现在的路线:

ss -ta | tail -n +2 |awk  '{print $4}' | sort -u
我知道我需要使用sed作为awk和sort之间的管道来移除冒号后的部分,但我不确定如何正确地进行

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

谢谢

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

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
或使用delimeter切割,如

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

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

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
或使用delimeter切割,如

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

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

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

如果没有可测试的样本输入和预期输出,这有点像猜测,但听起来您需要的只是

ss -ta | awk '{$0=$4;sub(/:[^:]+$/,"")} NR>1 && !seen[$0]++'
e、 g.使用
cat文件
而不是
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

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

ss -ta | awk '{$0=$4;sub(/:[^:]+$/,"")} NR>1 && !seen[$0]++'
e、 g.使用
cat文件
而不是
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

提供一个语料库和您想要的输出。提供一个语料库和您想要的输出。++,但为了清晰起见,可以将
“g”
替换为
1
。并提及由于gensub()的原因,它是特定于gawk(和mawk?)的,并将regexp更改为
:[^::*$
,以从最后一个
删除到最后一个,而不是从第一个,但是为了清楚起见,也许可以将
“g”
替换为
1
,并提及由于gensub()的原因,它是特定于gawk(和mawk?)的,并将regexp更改为
:[^::::*$
以从最后一个
删除到最后一个