我需要查看一行,并根据第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循环,但是我真的不知道。
什么是正确的答案? :)
答案 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"