Awk 监视服务器连接-Netstat格式问题

Awk 监视服务器连接-Netstat格式问题,awk,grep,watch,netstat,uniq,Awk,Grep,Watch,Netstat,Uniq,我最近在服务器上遇到了一些问题。 所以我只想留下一个窗口,显示连接设备的唯一和IP 我一直在使用: watch -n 5 "netstat -tn 2>/dev/null | grep :80 | awk '{print $5}' | sed 's/.*::ffff://' | sort | uniq -c | sort -nr" 这一切正常,但我有一个格式问题,我无法解决,它似乎是当本地连接出现 输出示例(屏幕截图) 没有管道的Netstat示例 造成混乱的原因是我使用的是awk'{p

我最近在服务器上遇到了一些问题。 所以我只想留下一个窗口,显示连接设备的唯一和IP

我一直在使用:

watch -n 5 "netstat -tn 2>/dev/null | grep :80 | awk '{print $5}' | sed 's/.*::ffff://' | sort | uniq -c | sort -nr"
这一切正常,但我有一个格式问题,我无法解决,它似乎是当本地连接出现

输出示例(屏幕截图) 没有管道的Netstat示例 造成混乱的原因是我使用的是
awk'{print$5}'
仅打印第5列

我之所以这样认为是因为我试图用手表和点子,但有些东西和另一个不一致

有人能建议对一行进行调整吗, 或者任何人都可以建议使用其他工具来监视与服务器的活动连接(对本地连接不感兴趣)

已编辑 这是我现在使用的。 由于格式问题太多,我决定不看

RED='\033[00;31m'
RESTORE='\033[0m'
YELLOW='\033[00;33m'
PURPLE='\033[00;35m'
LCYAN='\033[01;36m'
BLUE='\033[00;34m'
LIGHTGRAY='\033[00;37m'

while true
do
echo -e ${RED}"Connection Script"
echo -e ${YELLOW}"Current Active Connections to the Server Port 80"
  netstat -tn 2>/dev/null | awk '/:80 / {print $5}' | sed 's/.*::ffff://' | sed 's/:.*//' | sort | uniq -c | sort -nr
echo -e ${RESTORE}
echo -e ${PURPLE}"FTP Connections: 21"
  netstat -tn 2>/dev/null | awk '/:21 / {print $5}' | sed 's/.*::ffff://' | sed 's/:.*//' | sort | uniq -c | sort -nr
echo -e ${RESTORE}
echo -e ${LCYAN}"SSH/'SFTP' Connections: 22"
  netstat -tn 2>/dev/null | awk '/:22 / {print $5}' | sed 's/.*::ffff://' | sed 's/:.*//' | sort | uniq -c | sort -nr
echo -e ${RESTORE}
echo -e ${RED}"Yellowfin Connections: 8181"
  netstat -tn 2>/dev/null | awk '/:8181 / {print $5}' | sed 's/.*::ffff://' | sed 's/:.*//' | sort | uniq -c | sort -nr
echo -e ${RESTORE}
MySQLCon=$(netstat -tn 2>/dev/null | awk '/:3306 /' | sort | uniq -c | sort -nr | wc -l)
echo -e ${RESTORE}
echo -e $LIGHTGRAY"MySQL Active Connections on port 3306 =" $MySQLCon
echo -e ${RESTORE}
  sleep 5
  clear
done
我感谢这里提供的反馈,这是一个有趣的学习曲线 输出脚本的示例:


由于IP特殊,部分图像已被遮光;-)

在这个“奇数”输出中有几个方面

查看
watch
声称正在运行的命令。具体看一下
awk
脚本。是否看到它是
awk'{print}'

这是因为您在双引号中嵌入了整个命令,因此shell本身作为位置参数展开
$5
,并且它在
awk
甚至运行之前消失,最后打印出整行

从管道中删除
sed
,您将看到输出中的每一行都是完整的一行。(或者从管道中删除
awk
,您将看到输出根本没有改变。)

某些行未满的唯一原因是
sed
正在删除包含该行的
::ffff:
之前的所有内容。您会注意到,末尾的IPv4线路都没有这样做(这就是它们全部显示的原因)。因此,事实上,您甚至接近您期望的输出是因为您双重覆盖了“仅打印远程IP列”的目标

这也是您在输出中获得status列的原因(尽管没有首先指示您想要它)

“修复”管道的命令中的Escape
\$

也就是说,要“不使用
grep
sed
”,请尝试以下方法:

netstat -tn | awk '/:80 / {print $5}'
看看你离你想要的有多近


这将在错误的列中匹配
:80
,因此如果您想将其限制为
本地地址
列,您可以通过使用
$4~/:80$/
而不是仅使用
/:80/
grep | awk
awk | sed
来实现这一点
awk
可以很容易地完成这三项工作,因此几乎没有理由这样使用管道。具体的格式问题是什么?您的示例屏幕截图有什么问题?有什么是不应该的?还有什么不应该存在的呢?第一个屏幕截图显示了外部IP,但我得到了下面所有的TCP连接。我仍在尝试了解linux的所有术语及其语法,但有人建议只使用像您这样的awk。问题是我永远无法让它和手表一起工作
awk'$5~/:80$/{split($5,A,“:”);如果(!u[A[1]++)打印A[1];}
或我正在使用的整行代码
watch-n5 netstat-tn2>/dev/null | awk'$5~/:80$/{split($5,A,“:”);如果(!u[A[1]++)打印A[1];})
谢谢你的解释,这是很有教育意义的。我现在明白了为什么使用引号和手表不能正常工作。也就是说,我已经离开了watch,而是每隔5秒创建一个循环脚本。这使我能够在不存在格式问题的情况下更多地使用Sed和AWK>例如,我已经分成了3列。HTTP 80连接、FTP 21连接、SSH 22连接。显示一个唯一的计数和会话时间,这样沿着这条路线走,我对输出有了更多的控制。