Bash if-then-else基于命令输出
我正在使用netstat命令获取网络信息。我想在这里对获取的协议设置一个条件。如果是TCP,我需要打印与UDP不同的列 下面是我试图做的,但它不起作用。如果我做错了什么,请提出建议:Bash if-then-else基于命令输出,bash,if-statement,Bash,If Statement,我正在使用netstat命令获取网络信息。我想在这里对获取的协议设置一个条件。如果是TCP,我需要打印与UDP不同的列 下面是我试图做的,但它不起作用。如果我做错了什么,请提出建议: if [$(netstat -anputw | awk '{print $1}')=="tcp"] then netstat -anputw | awk '{print $1,",",$4"}' >> $HOME/MyLog/connections_$HOSTNAME.csv elif [$(net
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
在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
我不知道您想要实现什么,但是我认为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
你为什么不让
netstat
把这两种情况混为一谈呢
netstat -anptw # Just tcp
netstat -anpuw # Just udp
另外,在tcp情况下,您似乎并不关心-p
信息,因此您最好不要要求它。在udp情况下,State列中没有数据,因此PID/程序名实际上将位于第6列
综上所述,我得到:
netstat -antw | awk '{print $1","$4}' >> $HOME/MyLog/connections_$HOSTNAME.csv
netstat -anpuw | awk '{print $5","$6}' >> $HOME/MyLog/connections_$HOSTNAME.csv
不过,我怀疑这也不是您要查找的信息。也许您想区分TCP侦听连接和非侦听连接