netstat 管道计数主机

netstat 管道计数主机

Unix管道问题:如何处理多行输入以输出行并插入一些管道进程。

echo "111 22222222" | awk '{print $1 " " $2 " " piped_processes_using_2nd_argument}'

一些上下文:netstat 解析以获取连接到 $current_ip 的外部 ip 地址列表,按降序排序,例如(不是真实情况):

$ netstat -plant |grep $current_ip | tr -s ' ' |cut -f5 -d' '|cut -f1 -d':' |sort -n |uniq -c |sort -nr
   7 8.8.8.8
   2 4.4.4.4
   1 186.2.168.190
   1 207.192.128.2

到目前为止,反向DNS使用

$ host 4.4.4.4 | tr -s " " | rev  | cut -f1 -d " " |rev
alu7750testscr.xyz1.gblx.mgmt.Level3.net.

从这些中,我想得到类似的信息(是的,将 ip 保留在输出中):

   7 8.8.8.8 google-public-dns-a.google.com.
   2 4.4.4.4 alu7750testscr.xyz1.gblx.mgmt.Level3.net.
   1 186.2.168.190 ddos-guard.net.
   1 207.192.128.2 www.NexQloud.com.

为了合并这些,我只能想到 awk,但由于我不熟悉它,结果非常丑陋:

netstat -plant |grep $current_ip | tr -s ' ' |cut -f5 -d' '|cut -f1 -d':' |sort -n |uniq -c |sort -nr  | awk '{ system("echo " $1 " " $2 " $(host "$2" | tr -s \" \" | rev  | cut -f1 -d \" \" |rev)") }' | sort -nr -k1

我想要一些更优雅、足够快的东西,以便在手表中调用 --interval=1 :-)

答案1

你喜欢| 吗?

我带来的最好的

current_ip=$(ifconfig eth0 | awk '$1 == "inet" { split($2,A,":") ; print A[2] ; } ')

netstat -plant | grep $current_ip | awk '{split($5,A,":") ; howmany[A[1]]++ ; }
END { for (h in howmany) printf "%d %s \n",howmany[h],h ;} '|
 sort -nr |
while read hm ho
do
  name=$(host $ho|awk '{print $NF}')
  echo $hm $ho $name
done

在哪里

  • 如果最后一个字符是管道,则无需转义新行
  • {split($5,A,":") ; howmany[A[1]]++ ; }记住每个主机并计数(剥离端口号后)
  • END { for (h in howmany) printf "%d %s \n",howmany[h],h ;}在netstat末尾,打印结果
  • name=$(host $ho|awk '{print $NF}')从IP获取主机名
  • use ${name%%.}摆脱结局.
  • 添加当前IP

不确定我的解决方案是否更好,我只有 4 个管道而不是 12 个。

相关内容