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

$snet_mask は $3 の "all" の値になるため、それは機能しないようです。そのため、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 に答える