首页 > 试题广场 >

netstat练习3-输出每个IP的连接数

[编程题]netstat练习3-输出每个IP的连接数
  • 热度指数:11776 时间限制: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
现在需要你输出每个IP的连接数,按照连接数降序排序。你的脚本应该输出
172.16.0.24 10
172.16.34.144 9
100.100.142.4 3
0.0.0.0 3
172.16.34.143 1
172.16.240.74 1
120.55.222.235 1
100.100.54.133 1
100.100.45.106 1
100.100.32.118 1
100.100.30.25 1
100.100.142.5 1
100.100.142.1 1

#!/bin/bash

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

for i in ${!map[@]}; do
	echo ${i}' '${map[${i}]}
done | sort -nrk2

发表于 2023-10-12 17:27:27 回复(0)
# 指定多个分隔符(空格和:)
# 多一个加号表明将连续出现的记录分隔符当做一个来处理
grep "tcp" | awk -F '[ :]+' '{print $6}' | sort | uniq -c | sort -nrk 1 | awk '{print $2,$1}'

发表于 2023-09-29 12:50:24 回复(0)
# 方法1
awk -F '[ :]+' '{if($8 ~ /[A-Z\_]+/ && $6 ~ /[0-9\.]+/ ){print $6}}' nowcoder.txt | sort | uniq -c | awk '{print $2" "$1}'| sort -rnk2

# 方法2:
awk -F '[ :]+' 'BEGIN{}{
    if($8 ~ /[A-Z\_]+/ && $6 ~ /[0-9\.]+/){
        dict[$6]++
    }
}END{
    for(each_ip in dict){
        printf("%s %d\n", each_ip, dict[each_ip])
    }
}' nowcoder.txt | sort -rnk2

发表于 2023-03-23 16:44:20 回复(0)
cat nowcoder.txt |grep tcp|awk '{print $5}'|cut -d ":" -f 1|sort|uniq -c |sort -r|awk '{print $2,$1}'
所以我这个错在哪里了?自己跑都没问题
发表于 2022-10-24 16:13:21 回复(0)
grep "^tcp" nowcoder.txt |awk '{print $5}' |grep -Po '(\d{1,3}.){3}\d{1,3}(?=\:)'|sort|awk '{a[$1]++}END{for(i in a) print i,a[i]}'|sort -k2 -nr
发表于 2022-09-08 15:42:39 回复(0)
# 一行穿
grep tcp nowcoder.txt | awk '{print $5}' | awk -F : '{print $1}' | sort | uniq -c | sort -rn | awk '{print $2,$1}'
发表于 2022-09-04 14:43:12 回复(0)
# awk '$0 ~ "tcp" {if(NR>1){print $5}}' | cut -d ":" -f1|sort | uniq -c \
# | sort -k1nr -k2r | awk '{print $2, $1}'
declare -A mp
while read line; do
    if [[ $line =~ tcp ]]; then
        temp=($line)
        ip=$(echo ${temp[4]} | cut -d ":" -f1)
        ((mp[$ip]+=1))
    fi
done

idx=0
for i in ${!mp[@]}; do
    arr[$idx]=$(echo $i ${mp[$i]})
    let idx++
done
echo ${arr[@]} | xargs -n2 | sort -k2nr -k1r

发表于 2022-09-03 19:52:35 回复(0)
awk '/tcp/{print $5}' nowcoder.txt|awk -F : '{print $1}'|sort|uniq -c|sort -nr|awk '{print $2,$1}'
发表于 2022-08-08 15:07:12 回复(0)
grep "tcp"|awk -F" " '{print $5}'|awk -F":" '{print $1}'|sort|uniq -c|sort -rn|awk '{print $2,$1}'
发表于 2022-07-29 14:18:24 回复(0)
#!/bin/bash
cat nowcoder.txt | grep 'tcp' | awk '{print ($5)}' | awk -F ":" '{
    a[$1]++} END {for (i in a) printf ("%s %d\n",i,a[i])}' | sort -rnk2 | awk '{print ($1,$2)}'
发表于 2022-07-26 21:50:17 回复(0)
cat nowcoder.txt|grep -v "Foreign Address"| awk '$1~/tcp/{print $5}'| awk -F ":" '{arr[$1]+=1}END{for(k in arr)print(k,arr[k])}'|sort -n -r -k 2
发表于 2022-07-17 17:55:21 回复(0)
#!/bin/bash
#牛客网第31题
awk  '
#匹配只有6列且第6列不等于7的行
NF==6 && $NF!=7{
#定义一个名为ip的数组,数组的键是每一行第五列对应的字符串,此字符串每出现一次,键对应的值加1
    ip[$5]++
}
#END:文件处理完后,使用END做一些处理
END{
#循环数组ip的每一个键
    for(i in ip)
#打印上述ip数组的键(i),以及一个空格,和每次循环的键对应的值(ip[i])
        print i" "ip[i]
}
#sort 根据第二个字段(-k2),按照数值(-n)降序(-r)排序
' nowcoder.txt | sed -r 's/:[*0-9]+//g' | sort -nrk2
发表于 2022-07-13 00:00:57 回复(0)
awk '/tcp/ {print $5}' nowcoder.txt| awk -F":" '{print $1}'|sort|uniq -c|awk '{print $2,$1}'|sort -r -k2 -n 
发表于 2022-07-01 16:18:12 回复(0)
awk -F " " '$0~/tcp/{print $4":"$5}' | awk -F ":" '{sum[$3]++}END{
for(x in sum){
    print x,sum[x]
}
}' | sort -r -n -k 2

# 從哪兒可以看出要求必須是tcp鏈接的呀
发表于 2022-05-11 18:23:26 回复(0)
 awk -F ":" '/tcp/{print $2}'| awk '{print $2}'| sort | uniq -c | sort -rn | awk '{print $2,$1}'
发表于 2022-05-10 10:40:24 回复(0)
grep "tcp" nowcoder.txt|awk '{print $5}'|awk -F [:] '{print $1}'|sort|uniq -c|sort -nr|awk '{print $2,$1}'
发表于 2022-04-25 19:45:05 回复(0)
cat nowcoder.txt 
| grep tcp 
| awk '{split($5,arr,":");if(arr[1]!=0) print arr[1];}' 
| sort 
| uniq -c 
| sort -rn -k 1 
| awk '{print $2,$1}'
这里没注意一个细节,split得到的arr索引是从1开始
发表于 2022-04-22 22:35:21 回复(0)
awk '$1 ~ "tcp" {
sub(":(([0-9]*?)|(\*))","",$5)
iplist[$5]++
}END{
for(i in iplist){
print i" "iplist[i]
}
}' nowcoder.txt |sort -k 2 -r -n
发表于 2022-04-12 11:24:24 回复(0)
#! /bin/bash
awk '{if($1 == "tcp") print $5}' | sort | uniq -c | awk -F "[:]" '{print $1}' | awk '{print $2 " " $1}' | sort -nr -k 2
#反复筛选和调整,写的很烂
发表于 2022-04-09 18:45:03 回复(0)