LoginSignup
0
0

More than 3 years have passed since last update.

シェルでマッチした部分を取り出したい

Last updated at Posted at 2021-01-29

具体例

mawkの場合

ip a s wlo1 | mawk '$0 ~ /^ * inet6 .* scope global dynamic /{print $2}' | mawk 'BEGIN{FS="/"} {print $1}'
alias myipv6='ip a s wlo1 | mawk '\''$0 ~ /inet6 .* scope global dynamic/{print $2}'\'' | mawk '\''BEGIN{FS="/"} {print $1}'\'''

基本的に、空白を区切り文字として、それ以外の文字を取り出す。

1、 wlo1インターフェースのネットワーク情報を表示
2、標準入力の各行で、正規表現にマッチしている部分を取り出す。
ipv6のグローバルアドレスにマッチする行を取り出して、その2番めのグローバルアドレス部分を標準出力へ。
空白で区切るので、1番目はinet6。3番めはscopeが入っている。
3、区切り文字に’/’を指定して、アドレスとプレフィクスを、さらに分けて、取り出します。
ipv6でプライバシーを優先されている場合、global dynamicではマッチせず、一時的なアドレスしかない場合もあるかもしれません。

gawkの場合

ip a s wlo1 | awk 'match($0,/inet6 (.*)\/[0-9][0-9] scope global/, a){ print a[1]}'
alias myipv6='ip a s wlo1 | awk '\''match($0,/inet6 (.*)\/[0-9][0-9] scope global/, a){ print a[1]}'\'''

解説

ipコマンドでアドレスを表示させ、ipv6のglobalなアドレスのみ取り出します。

  1. ip address show コマンドでインターフェースwlo1(wifiインターフェース)を表示しています。
    上記では省略形を使っています。ip a s <interface>

  2. gawkを使って、正規表現で、アドレス部分にマッチする部分のみを取り出します。
    matchで、標準入力$0、この場合は、ip a s wlo1 の結果を受けとり、マッチ結果をaに代入します。
    一致した部分の中でも、括弧でくくられた部分を取り出すことができます。
    今回は括弧でくくった部分が一つなので、1番目ということで、 a[1] をprintして、表示しています。
    マッチしたn番目の要素を取り出したい、といった時に使えます。

補足

正規表現の
/inet6 (.*)\/[0-9][0-9] scope global/
は、ipv6でglobalアドレスを示す行を取り出すために指定した正規表現です。

私の環境ではprefixが64ですので、
/inet6 (.*)\/64 scope global/
でも問題ありません。2桁の数字を想定しています。

aliasに指定する場合の書式は、クォーテーションがちょっとわかりにくいかもしれません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0