2016-03-06 52 views
1

我想從配置中獲取IP地址的列表,我收到它們的格式爲:*.*.*.*:*其中最後一個字段是建立的連接的端口號。 我該如何擺脫碼頭數字? 這裏是我現在做這一行:擺脫線匹配模式的結束linux

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

我瞭解我必須使用SED作爲AWK之間的管道和排序冒號後取出一部分,但我不知道如何去做正確的方式。

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

提供一個語料庫,和你想要的輸出。 –

回答

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 
+0

@EdMorton修復了它 – ritesht93

1

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

+1

++,但爲了清楚起見,可能用'1'代替'「g」'。 – mklement0

+0

,並提到它是由於gensub()引起的gawk(和mawk?),並將regexp更改爲':[^:] * $'以從最後一個':'移除到最後而不是第一個。 –

4

沒有檢驗的樣品的輸入和預期的輸出這是一個有點猜測,但它聽起來像你需要的是

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

例如使用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