2文字に分けてawkを一度だけ実行できますか?

2文字に分けてawkを一度だけ実行できますか?

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キー検索はlocalIPアドレスを格納する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 }'

関連情報