Bash循环和if语句

时间:2013-03-27 16:46:31

标签: bash sed awk

我需要查看一行,并根据第3列的内容对其执行快速if / then->回音。

该文件如下所示:

name network subnetmask
net_A 192.168.0.0 24
net_b 10.10.0.0 16

有些列也有一个空白的第3列,我还需要一个if / then。

Psuedo-code在我看来应该是这样的:

snet_mask=`cat $filename | grep -i net | awk '{print $3}`
if [ $snet_mask = 24 ]
then
awk '{print "something"$1,"something else"}'
fi
if [ $snet_mask = 23 ] 
then
awk '{print "something"$1,"something else"}'
fi

这似乎不起作用,因为$ snet_mask变成了$ 3的“all”的值,所以我想我需要一个基于grep -i net的for循环,但是我真的不知道。

什么是正确的答案? :)

3 个答案:

答案 0 :(得分:1)

试试这个单行:

awk '$1 ~ "^net" && $3==24{print "something", $3, "something else"} $1 ~ "^net" $3==23{print "something", $3, "something else"}' file.txt

或多线(更易于阅读):

awk '
     $1 ~ "^net" && $3==24{print "something", $3, "something else"}
     $1 ~ "^net" && $3==23{print "something", $3, "something else"}
' file.txt

我们也可以这样做(取决于你的需要):

awk '
     $1 ~ "^net" && ($3==24 || $3==23) {print "something", $3, "something else"}
' file.txt

甚至更简单&最正确的正则表达式:

awk '
     $1 ~ "net" && $3 ~ "^2[34]$" {print "something", $3, "something else"}
' file.txt

答案 1 :(得分:1)

你可以在awk语句中完成你需要的东西,因为你已经在使用awk

cat $filename | grep -i net | awk '{if($3==24) print $1; else print $0;}'

在if语句中(如果第3列是23),我只打印第一列,否则我打印所有内容。显然,您可以扩展它以适用于所有情况

答案 2 :(得分:0)

在没有外部工具的情况下保持bash,你可以这样做:

while read name network netmask ; do
    if [[ "$name" == net* ]] ; then
        case "$netmask" in
            "") echo "It's empty" ;;
            24) echo "It's 24" ;;
            23) echo "It's 23" ;;
             *) echo "None of the above" ;;
        esac
    fi
done < "$filename"
相关问题