ip a
複数のIPアドレスとインターフェイスの状態を作成する
私は次のようにawk '/inet / {print $2}'
IPとサブネットを得ました。
wolf@linux:~$ ip a | awk '/inet / {print $2}'
127.0.0.1/8
10.10.0.1/24
10.10.1.1/24
wolf@linux:~$
その後、CIDRシンボルを削除するために別のawkにパイプしました。
wolf@linux:~$ ip a | awk '/inet / {print $2}' | awk -F / '{print $1}'
127.0.0.1
10.10.0.1
10.10.1.1
wolf@linux:~$
awk出力を別のawkにパイプすることなくこれを実行できますか?
希望の出力
wolf@linux:~$ ip a | <awk syntax here without additional piping>
127.0.0.1
10.10.0.1
10.10.1.1
wolf@linux:~$
答え1
実際に使用するように定義したフィールド区切り文字-F
は正規表現です。したがって、次のコマンドを渡す必要があります。
ip a | awk -F'[ /]+' '/inet / {print $3}'
答え2
ip a | awk '/inet / {FS="/"; $0=$2; print $1; FS=" "}'
最初に一致するレコードは、FS
デフォルト値(スペース)に基づいてフィールドに分割されます。その後、FS
新しいものを設定します。交換すると、$0=$2
新しいものに基づいて再分割されますFS
。今、$1
私たちが欲しいものが含まれているので、印刷してみましょう。最後に、我々はFS
次のマッチング記録を立てた。
答え3
この非常に具体的なケースについてより良い使用を検討しましたかip
?たとえば、
ip -j -p -f inet a | awk -F \" '/local/ {print $4}'
これにより、ip address
キー検索はlocal
IPアドレスを格納するJSONオブジェクトとして印刷されます。よりシャープにするには、次のものを使用できますjq
。
ip -j -p -f inet a | jq '.[].addr_info[].local'
ip addr
出力の変更に影響されないため、最後のコマンドをお勧めします。しかし、もともとデザインが本当に好きなら、次の選択をします。
ip a | awk '/inet / {print substr($2, 1, index($2,"/")-1)}'
または
ip a | awk '/inet / {split($2, addr, "/"); print addr[1]}'
最初のコマンドはそのindex($2, "/")
場所を見つけ/
、$2
それを使用してsubstr
部分文字列を生成します。数秒で、我々はそれを分割し$2
て配列/
に保存します。addr
答え4
/
次の文字を空の文字列に置き換えることができます。
ip a | awk '/inet /{ sub(/\/.*/, "", $2); print $2 }'