web-dev-qa-db-ja.com

awkを1回だけ実行して、2つの文字で分割できますか?

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:~$ 
6
Wolf

この非常に特殊なケースで、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配列に格納します。

10
PEdroArthur

実際に定義したフィールドセパレータは-Fは正規表現です。したがって、次のコマンドで配信されます。

ip a | awk -F'[ /]+' '/inet / {print $3}'
12
woodengod
ip a | awk '/inet / {FS="/"; $0=$2; print $1; FS=" "}'

最初に一致したレコードは、デフォルトのFS(スペース)に従ってフィールドに分割されます。次に、新しいFSが設定されます。 $0=$2を代入すると、新しいFSに従って分割が再度行われます。これで$1に必要なものが含まれ、それを印刷します。最後に、次の一致するレコードにFSを設定します。

10

/および空の文字列を持つ次の文字:

ip a | awk '/inet /{ sub(/\/.*/, "", $2); print $2 }'
7
Freddy