2016-03-06 2 views
1

Я пытаюсь получить список ip-адресов из конфигурации, и я получаю их в формате: *.*.*.*:*, где последним полем является номер порта установленного соединения. Как я могу избавиться от номера порта? здесь линия я теперь делать:избавиться от конца строк, соответствующих шаблону linux

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

Я понимаю, что нужно с помощью СЭД, как трубы между 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

++, но, возможно, замените '' g "' на '1' для ясности. – mklement0

+0

и упомянуть о gawk (и mawk?), Специфичном из-за gensub(), и изменить регулярное выражение на ': [^:] * $', чтобы удалить из последнего ':' в конец, а не из первого. –

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 
Смежные вопросы