В эти дни я отправляю использовать 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
».
(Надеюсь, кто-нибудь сможет разъяснить это)
На основе оболочки ( 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