Назад | Перейти на главную страницу

Netstat count TIME_WAIT соединений по портам

Я могу получить отдельные значения TIME_WAIT для порта,

netstat -nat | grep :11300 | grep TIME_WAIT | wc -l;

но как это сделать на основе всех портов, например:

11300   2900 connection
3306    1200 connection
80      890 connection

В эти дни я отправляю в пользование sed для такого рода вещей.

$ netstat -nt | sed -r -n 's/^tcp +[0-9]+ +[0-9]+ [0-9\.]+(:[0-9]+).+TIME_WAIT/\1/p' | sort | uniq -c | sort -n
      5 :443  
      8 :80

Здесь нас интересует линия, которая выглядит особым образом, но на самом деле является единым целым. Итак, мы определяем регулярное выражение с группой совпадений для этой части, а затем печатаем только совпадающий фрагмент строк, который нас интересует. Я не нашел лучшего пути sort | uniq -c. Последний вид предназначен для эстетики и полезности.

Я уверен, что есть более чистый способ сделать это без двойных-awkи дваждыgrep'ing. (Надеюсь, кто-нибудь сможет объяснить это)

На основе оболочки (ksh и bash) For-Loop

for x in $ (netstat -nat | grep TIME_WAIT | awk '{print $4}' | \
            awk -F":" '{print $2}' | sort -u) ; do
   printf "TIME_WAIT on Port $x : `netstat -nat|grep ":$x"|grep TIME_WAIT|wc -l`\n"
done

Вывод

TIME_WAIT on Port 42489 : 1
TIME_WAIT on Port 80 : 9