正規表現の一致結果に関する質問

正規表現の一致結果に関する質問

次のコマンドを実行しました。

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:。次に、inet3番目の列はマスクされた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アドレスと一致すると、-oargはgrepに文字列の一致する部分のみを印刷するように指示します。 awkは文字列の先頭にある「LAN:」を置き換えます。

次に、コードスニペットが要求どおりに機能する理由を学びます。キーがない場合、-ogrepは文字列全体を印刷し、awkはスペースで区切られた3番目の「単語」である3番目の「引数」を印刷します。

関連情報