首页 > 试题广场 >

netstat练习2-查看和3306端口建立的连接

[编程题]netstat练习2-查看和3306端口建立的连接
  • 热度指数:13956 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
假设netstat命令运行的结果我们存储在nowcoder.txt里,格式如下:
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:6160            0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 172.16.56.200:41856     172.16.34.144:3306      ESTABLISHED
tcp        0      0 172.16.56.200:49822     172.16.0.24:3306        ESTABLISHED
tcp        0      0 172.16.56.200:49674     172.16.0.24:3306        ESTABLISHED
tcp        0      0 172.16.56.200:42316     172.16.34.143:3306      ESTABLISHED
tcp        0      0 172.16.56.200:44076     172.16.240.74:6379      ESTABLISHED
tcp        0      0 172.16.56.200:49656     172.16.0.24:3306        ESTABLISHED
tcp        0      0 172.16.56.200:58248     100.100.142.4:80        TIME_WAIT
tcp        0      0 172.16.56.200:50108     172.16.0.24:3306        ESTABLISHED
tcp        0      0 172.16.56.200:41944     172.16.34.144:3306      ESTABLISHED
tcp        0      0 172.16.56.200:35548     100.100.32.118:80       TIME_WAIT
tcp        0      0 172.16.56.200:39024     100.100.45.106:443      TIME_WAIT
tcp        0      0 172.16.56.200:41788     172.16.34.144:3306      ESTABLISHED
tcp        0      0 172.16.56.200:58260     100.100.142.4:80        TIME_WAIT
tcp        0      0 172.16.56.200:41812     172.16.34.144:3306      ESTABLISHED
tcp        0      0 172.16.56.200:41854     172.16.34.144:3306      ESTABLISHED
tcp        0      0 172.16.56.200:58252     100.100.142.4:80        TIME_WAIT
tcp        0      0 172.16.56.200:49586     172.16.0.24:3306        ESTABLISHED
tcp        0      0 172.16.56.200:41754     172.16.34.144:3306      ESTABLISHED
tcp        0      0 172.16.56.200:50466     120.55.222.235:80       TIME_WAIT
tcp        0      0 172.16.56.200:38514     100.100.142.5:80        TIME_WAIT
tcp        0      0 172.16.56.200:49832     172.16.0.24:3306        ESTABLISHED
tcp        0      0 172.16.56.200:52162     100.100.30.25:80        ESTABLISHED
tcp        0      0 172.16.56.200:50372     172.16.0.24:3306        ESTABLISHED
tcp        0      0 172.16.56.200:50306     172.16.0.24:3306        ESTABLISHED
tcp        0      0 172.16.56.200:49600     172.16.0.24:3306        ESTABLISHED
tcp        0      0 172.16.56.200:41908     172.16.34.144:3306      ESTABLISHED
tcp        0      0 172.16.56.200:60292     100.100.142.1:80        TIME_WAIT
tcp        0      0 172.16.56.200:37650     100.100.54.133:80       TIME_WAIT
tcp        0      0 172.16.56.200:41938     172.16.34.144:3306      ESTABLISHED
tcp        0      0 172.16.56.200:49736     172.16.0.24:3306        ESTABLISHED
tcp        0      0 172.16.56.200:41890     172.16.34.144:3306      ESTABLISHED
udp        0      0 127.0.0.1:323           0.0.0.0:*
udp        0      0 0.0.0.0:45881           0.0.0.0:*
udp        0      0 127.0.0.53:53           0.0.0.0:*
udp        0      0 172.16.56.200:68        0.0.0.0:*
udp6       0      0 ::1:323                 :::*
raw6       0      0 :::58                   :::*                    7
现在需要你查看和本机3306端口建立连接并且状态是established的所有IP,按照连接数降序排序。你的脚本应该输出
10 172.16.0.24
9 172.16.34.144
1 172.16.34.143

希尔排序
declare -A map
while read line
    do
        tmp=($line)
        ip=(${tmp[4]/:/ })
        [ ${tmp[0]} == "tcp" ] && [ ${tmp[5]} == "ESTABLISHED" ] && [ ${ip[1]} -eq 3306 ] &&  ((map["${ip[0]}"]++))
    done < nowcoder.txt
    tmp=()
    for ve in ${map[*]}
        do
            tmp[${#tmp[*]}]=$ve
        done
    q=${#tmp[*]}
for (( gap=q>>1; gap>0; gap=gap>>1 ))
    do
        for (( i=gap; i<q; i++ ))
            do
                temp=${tmp[$i]}
                for (( a=i-gap; a>=0&temp>${tmp[$a]}; a-=gap ))  #默认升序, 如果降序排序改为(( a=i-gap; a>=0&temp>${arr[$a]}; a-=gap ))
                    do
                        tmp[$a+$gap]=${tmp[$a]}
                    done
                tmp[$a+$gap]=$temp
            done
    done
for ((i=0; i<$q; i++))
    do
        for ve in ${!map[*]}
            do
                if [ ${tmp[$i]} -eq ${map[$ve]} ];then
                    printf "${map[$ve]} $ve\n"
                fi
            done
    done


发表于 2021-12-06 09:08:59 回复(1)
awk '{
if($0 ~"3306"){
    if($6=="ESTABLISHED"){
        a[$5]++
    }

}}
END{
for(i in a){
print a[i],i
}
}' | sed 's/:3306//' | sort -nr -k1

发表于 2021-12-19 01:34:10 回复(0)
cat nowcoder.txt | grep '3306' | grep 'ESTABLISHED' | awk -F ' ' '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr -k1 | awk '{print $1" "$2}'

发表于 2022-05-06 10:28:09 回复(0)
这题不是有问题?
发表于 2022-05-19 16:40:39 回复(1)
cat nowcoder.txt | grep 3306 | grep ESTABLISHED | awk '{print $5}'| awk -F ':' '{print $1}' | sort | uniq -c | sort -nr | awk '{print $1,$2}’
发表于 2022-03-14 20:05:57 回复(1)
应该不是本地端口吧
发表于 2025-11-17 18:37:28 回复(0)
第一种:awk '{if($6 == "ESTABLISHED" && $5 ~ "3306"){sum[$5]++}}END{for(i in sum){print sum[i],i}}' nowcoder.txt | sort -rnk1 | sed -r '/:3306/d'
第二种:awk '{if($6 == "ESTABLISHED" && $5 ~ "3306"){sum[$5]++}}END{for(i in sum){split(i,a,":");print sum[i],a[1]}}' nowcoder.txt | sort -rnk1




发表于 2025-09-27 15:31:39 回复(0)
#!/bin/bash

cat nowcoder.txt|grep 3306|awk '{print $5}'|awk -F ":" '{print $1}'|sort -r|uniq -c|sort -nr|awk '{print $1,$2}'

发表于 2025-06-14 17:50:16 回复(0)
grep "ESTABLISHED" nowcoder.txt |awk -F "[: ]+" '/3306/ {print $6}' |sort |uniq -c |sort -nr |awk '{print $1,$2}'
发表于 2025-03-28 18:14:50 回复(0)
grep '3306' test30 | awk 'split($5,addr,":"){print addr[1]}' | sort -n | uniq -c | sort -nr | awk '{print $1,$2}'
话说这个3306不应该是本地端口吗。。
发表于 2025-01-19 15:43:44 回复(0)
grep '3306' nowcoder.txt | grep 'ESTABLISHED' | awk '{print $5}' | sort | uniq -c |sort -rn | awk -F ':' '{print $1}'| awk  '{print $1 " " $2}'
发表于 2024-07-04 14:08:05 回复(1)
grep ":3306" nowcoder.txt|awk '{print $5}'|awk -F ":" '{print $1}'|sort|uniq -c|sort -k1 -nr|sed 's/^ *//'
发表于 2024-06-07 17:37:58 回复(0)
awk '/.*3306.*ESTABLISHED.*/{print $5}' nowcoder.txt | cut -d ":" -f 1 | sort | uniq -c | sort -rn | awk '{print $1,$2}'

cat nowcoder.txt | awk '/.*3306.*ESTABLISHED.*/{print $5}' | awk -F ":" '{
    if(a[$1]==""){a[$1]=1;}
    else{a[$1]=a[$1]+1;}
}END{
    for( i in a){
        print a[i],i
    }
 }'  | sort -nr 

编辑于 2024-01-27 13:17:44 回复(0)
cat nowcoder.txt |grep '3306'|grep 'ESTABLISHED' | awk '{print $5}'  |awk -F ':' '{print $1}' |sort |uniq -c |sort -rn |awk '{print $1,$2}'
发表于 2023-11-24 16:02:31 回复(0)
#!/bin/bash

declare -A map
while read line; do
	arr=($line)
	[[ ${arr[0]} == tcp ]] && [[ ${arr[4]} =~ :3306 ]] && ((map["${arr[4]}"]++))
done <nowcoder.txt

for i in ${!map[@]}; do
	arr=(${i//:/ })
	echo ${map[${i}]}' '${arr[0]}
done | sort -nr

发表于 2023-10-12 17:18:28 回复(0)
cat nowcoder.txt | grep 'tcp' | grep -v '*' | awk -F ' ' '{print $5}' | grep '3306' | cut -d ':' -f1 | sort | uniq -c | sort -nr | awk '{print $1 " " $2 }'
发表于 2023-08-17 14:43:19 回复(0)
grep -E -i "established" | grep "3306"  | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | awk '{print $1" "$2}' | sort -nr


发表于 2023-08-04 15:15:05 回复(0)
awk 'BEGIN{FS="[ ]+|:";PROCINFO["sorted_in"]="@val_num_desc"}/ESTABLISHED/&&/3306/{arr[$6]++}END{for(i in arr){print arr[i],i}}' nowcoder.txt
发表于 2023-06-05 23:45:53 回复(0)

1. grep查找,awk分割两次,排序,计数,排序,打印
grep '3306.*ESTABLISHED' nowcoder.txt | awk '{print $5}' | awk -F ':' '{print $1}' | sort | uniq -c | sort -nr | awk '{print $1, $2}'  

2. grep查找,awk分割,sed将:3306替换为空,排序,计数,排序,打印
grep '3306.*ESTABLISHED' nowcoder.txt | awk '{print $5}' | sed 's/:3306//g' | sort | uniq -c | sort -nr | awk '{print $1, $2}' 

3. awk查找,分割两次,排序,计数,排序,打印
awk '/3306.*ESTABLISHED/ {print $5}' nowcoder.txt | awk -F ':' '{print $1}' | sort | uniq -c | sort -nr | awk '{print $1, $2}'

4. awk查找,分割,sed将:3306替换为空,排序,计数,排序,打印
awk '/3306.*ESTABLISHED/ {print $5}' nowcoder.txt | sed 's/:3306//g' | sort | uniq -c | sort -nr | awk '{print $1, $2}'

5. awk查找,substr子串,排序,计数,排序,打印
awk '/3306.*ESTABLISHED/ {print substr($5, 0, length($5) - 5)}' nowcoder.txt | sort | uniq -c | sort -nr | awk '{print $1, $2}'

发表于 2023-05-07 22:45:23 回复(0)
grep ':3306' nowcoder.txt |grep ESTABLISHED|awk '{print $5}'| awk -F : '{print $1}'|sort|uniq -c|sort -nr | awk '{print $1,$2}'
发表于 2023-04-21 16:25:49 回复(0)