🇯🇵

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

2021/01/29に公開

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

at 2021-01-29
(2021-02-12 last update)

具体例
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に指定する場合の書式は、クォーテーションがちょっとわかりにくいかもしれません。

Discussion