1

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

该文件如下所示:

name network subnetmask
net_A 192.168.0.0 24
net_b 10.10.0.0 16

有些列也有一个空白的第 3 列,我也需要为这些列设置一个 if/then。

在我看来,伪代码应该是这样的:

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

ETC

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

正确答案是什么?:)

4

3 回答 3

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
于 2013-03-27T16:52:12.223 回答
1

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

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

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

于 2013-03-27T16:52:28.237 回答
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"
于 2013-03-27T16:58:29.857 回答