Я могу получить отдельные значения 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