次のコマンドを実行しました。
ip addr | grep -En 'inet (([0-9]*\.){3}[0-9]*)/24' | awk '{print "LAN:" $3 }'
結果が「192.168.123.245/24」ですが、これではないのはなぜですか192.168.123.245
?
もう一つの質問は3ドルを使うべきです。代わりにipを印刷してください$1
。
答え1
その部分なしでコマンドを実行すると、awk
何が必要かを知ることができます$3
。
ip addr | grep -En 'inet (([0-9]*\.){3}[0-9]*)/24'
どんな命令もawk
あなたにそのようなことを与えません。
11: inet 192.168.1.26/24 brd 192.168.1.255 scope global dynamic noprefixroute wlp1s0
21: inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
最初の列が行番号11:
であることがわかります21:
。次に、inet
3番目の列はマスクされたIP番号です。 grepで何をしても、IP番号には常にネットマスクが追加されます。ネットマスクを削除するには、sed
見つかった行を変更する他のものを使用する必要があります。 Grepは見つかった内容のみを表示します。
この試み:
ip addr | grep -En 'inet (([0-9]*\.){3}[0-9]{1,3})/24' | awk '{print "LAN:" $3 }' | sed -En 's/(LAN:.*)\/24/\1/p'
もっとエレガントにできると思います。
答え2
これにより、トリックを実行できます。
ip addr | grep 'inet.*\/24' | grep -oE '(([0-9]*\.){3}[0-9]*)' | awk '{ print "LAN:"$1 }'
まず、grepを使用して/ 24ネットワークでラインをキャプチャします。次に、IPv4アドレスと一致すると、-o
argはgrepに文字列の一致する部分のみを印刷するように指示します。 awkは文字列の先頭にある「LAN:」を置き換えます。
次に、コードスニペットが要求どおりに機能する理由を学びます。キーがない場合、-o
grepは文字列全体を印刷し、awkはスペースで区切られた3番目の「単語」である3番目の「引数」を印刷します。