if-then-else基于命令输出

时间:2014-11-14 13:58:47

标签: 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 [$(netstat -anputw | awk '{print $1}')=="udp"] then

netstat -anputw | awk '{print $5,",",$7}' >> $HOME/MyLog/connections_$HOSTNAME.csv

fi

3 个答案:

答案 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侦听和非侦听连接。