我正在使用netstat命令获取有关网络的信息。我想在这里提出一个条件来获取协议。如果是TCP,我需要打印与UDP不同的列。
以下是我要做的事情,但它不起作用。请建议并告知我是否有错误:
if [$(netstat -anputw | awk '{print $1}')=="tcp"] then
netstat -anputw | awk '{print $1,",",$4"}' >> $HOME/MyLog/connections_$HOSTNAME.csv
elif [$(netstat -anputw | awk '{print $1}')=="udp"] then
netstat -anputw | awk '{print $5,",",$7}' >> $HOME/MyLog/connections_$HOSTNAME.csv
fi
答案 0 :(得分:0)
始终在if [
之后和]
之前的if语句中留一个空格,如果要进行字符串比较,则应将命令$(netstat -anputw | awk '{print $1}'
置于双引号下。
这是最后的剧本:
if [ "$(netstat -anputw | awk '{print $1}')" == "tcp" ]; then
netstat -anputw | awk '{print $1,",",$4"}' >> $HOME/MyLog/connections_$HOSTNAME.csv
elif [ "$(netstat -anputw | awk '{print $1}') " == "udp" ]; then
netstat -anputw | awk '{print $5,",",$7}' >> $HOME/MyLog/connections_$HOSTNAME.csv
fi
答案 1 :(得分:0)
我不知道你想要实现的目标,但是我认为netstat会返回一个列表而不是字符串,因此将输出与字符串进行比较是没有意义的。你必须循环它。请尝试以下
#!/bin/bash
OUTPUT=$(netstat -anputw | awk '{print $1}');
for LINE in $OUTPUT
do
if [[ $LINE == "tcp" ]] ; then
echo "TCP!"
elif [[ $LINE == "udp" ]] ; then
echo "UDP!"
fi
done
答案 2 :(得分:0)
为什么不通过不要求netstat
混淆这两种情况来区分这两种情况?
netstat -anptw # Just tcp
netstat -anpuw # Just udp
此外,在tcp案例中,您似乎并不关心-p
信息,因此您可能不会要求它。在udp情况下,State列中没有数据,因此PID / Program名称实际上位于第6列。
把它放在一起,我得到:
netstat -antw | awk '{print $1","$4}' >> $HOME/MyLog/connections_$HOSTNAME.csv
netstat -anpuw | awk '{print $5","$6}' >> $HOME/MyLog/connections_$HOSTNAME.csv
我怀疑这不是你正在寻找的信息。也许您想要区分TCP侦听和非侦听连接。