私はDebian用の小さなbashスクリプトを書いています。 IPv4の3番目のオクテットを見つけて「ip1」変数にプッシュし、最後のオクテットを「ip2」変数にプッシュしたいと思います。いくつかの調査の終わりに最初のオクテットを提供する必要があるスクリプトを見つけましたが、この部分を理解していません。
'(?<=inet )[^.]+'
誰かが私にこれを説明し、私のニーズに合わせて調整できる方法を説明できますか?
私はこれを読んだhttps://explainshell.com/…だから、-oPがどのように機能するのかを知っていますが、まだ最後の部分を理解していません。
ip1=$(ip a show | grep -oP '(?<=inet )[^.]+')
ip2=$(ip a show | grep -oP '(?<=inet )[^.]+')
答え1
-P
grep
これはPerl正規表現構文を使用する必要があることを意味します。 Perlでは(?<=pattern)
、幅0の肯定的なLookBehindアサーションつまり、一致するもの自体の前に現れるべきアンカーです。したがって、アンカーが続く場合、一致は(?<=inet )[^.]+
ピリオド()ではなく空でない文字のシーケンス、つまり対応するIPアドレスの最初です。出力ラインがバイトネットワークインターフェイスであるためです。[^.]+
"inet "
ip address show
inet 127.0.0.1/8 scope host lo
-o
これは、オプションが出力マッチングを作成し、マッチングにとって重要であるにもかかわらず、対応するビットを印刷したくgrep
ないためです。"inet "
問題は、さまざまなIPアドレスの最初のバイトだけで何ができるのか、そしてip2
なぜip1
。スクリプトはどのような用途に使用されますか?
特定の要件に応じて、次の例があります。
# get last two bytes of IP (assume in 192.168.*. network)
last_two=$(ip a show | grep -oP '(?<=inet 192\.168\.)[^/]+')
# Split result in two
IFS=. read net host <<< $last_two