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:~$
次に、それを別のawkにパイプしてCIDR表記を削除します。
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:~$
この非常に特殊なケースで、ip
のより良い使用を検討しましたか?例えば:
_ip -j -p -f inet a | awk -F \" '/local/ {print $4}'
_
これにより、JSONオブジェクトとして_ip address
_が出力され、local
キーの検索が行われます。これには、たまたまIPアドレスが格納されます。 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
配列に格納します。
実際に定義したフィールドセパレータは-F
は正規表現です。したがって、次のコマンドで配信されます。
ip a | awk -F'[ /]+' '/inet / {print $3}'
ip a | awk '/inet / {FS="/"; $0=$2; print $1; FS=" "}'
最初に一致したレコードは、デフォルトのFS
(スペース)に従ってフィールドに分割されます。次に、新しいFS
が設定されます。 $0=$2
を代入すると、新しいFS
に従って分割が再度行われます。これで$1
に必要なものが含まれ、それを印刷します。最後に、次の一致するレコードにFS
を設定します。
/
および空の文字列を持つ次の文字:
ip a | awk '/inet /{ sub(/\/.*/, "", $2); print $2 }'