Numpty
Numpty

Reputation: 1481

Of Bash loops and if statements

I need to look at a line, and perform a quick if/then->echo on it depending on the content of column 3.

The file looks like this:

name network subnetmask
net_A 192.168.0.0 24
net_b 10.10.0.0 16

Some columns also have a blank 3rd column, and I need to have an if/then for those as well.

Psuedo-code should look like this in my mind:

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

That just doesn't work it seems, since $snet_mask becomes the value of "all" of $3, so I think I need a for loop based on grep -i net, however I don't really know.

What's the right answer? :)

Upvotes: 1

Views: 453

Answers (3)

Gilles Quénot
Gilles Quénot

Reputation: 185106

Try this one-liner :

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

Or on multi-lines (easier to read) :

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

We can do it simply like this too (depends of your needs) :

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

Or even simpler & shortest with a regex :

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

Upvotes: 1

William
William

Reputation: 4935

Staying in bash without external tools, you could do something like this:

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"

Upvotes: 0

Brett
Brett

Reputation: 4061

you could accomplish what you need in an awk statement, since you're already using awk

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

In the if statement (if 3rd col is 23), I'm printing just the first column, otherwise I'm printing everything. Obviously you can expand this to work with all of your cases

Upvotes: 1

Related Questions