私が管理しているすべてのサーバーのさまざまなインターフェイスのネットワーク構成に関する特定の情報を印刷したいと思います。
- インターフェース名
- インターフェイスIPv4アドレス
- インターフェイスハードウェアMACアドレス
- …
残念ながら、単純ファイルでは、改行ip -o addr show
のために出力を簡単に解析できません。awk
ip addr show
で印刷できますか?正確にインターフェイスごとに1つのワイヤ?
awk
それ以外の場合は、and / orを使用して同じ結果を得ることができますかsed
?行はツリーごとにリンクする必要があるため、これは両方のコマンドに関する私の知識を超えています。
答え1
--briefフラグを使用してください。
ip --brief address show
答え2
最新バージョンでは、ip
このオプションを使用して-j
データをJSON形式で出力し、次のフィルタを使用できますjq
。たとえば、eth0
インターフェイスに IPv4 アドレスが印刷されます。
$ ip -j addr show dev eth0 | jq -r '.[0].addr_info | map(select(.family == "inet"))[0].local'
192.168.0.1
または、マシンのすべてのIPv4アドレスのリストを1行に1つずつインポートします。
ip -j addr show | jq -r 'map(.addr_info) | map(map(select(.family == "inet").local)) | flatten | .[]'
127.0.0.1
192.168.0.1
172.19.0.1
172.17.0.1
172.18.0.1
select(...)
たとえば、IPv6アドレスを含めるには削除します。他の多くの変形が可能である。
答え3
はいip -o addr show
、しかし、より少ない情報が印刷されます。
ip addr show
これは各インターフェイスの出力を1行に圧縮する方法です。最初の行を除いて、各インターフェイスの開始前に改行文字を印刷し、ファイルの末尾に改行文字を印刷します。
ip addr show |
awk '/^[^ ]/ && NR!=1 {print ""}
{printf "%s", $0}
END {print ""}'
答え4
スクリプトはあなたが要求した情報を提供するためにgawk
解析します。ip addr show
複数のIPv4アドレスはコンマで接続されています。
ip a | awk 'function outline() {if (link>"") {printf "%s %s %s\n", iface, inets, link}} $0 ~ /^[1-9]/ {outline(); iface=substr($2, 1, index($2,":")-1); inets=""; link=""} $1 == "link/ether" {link=$2} $1 == "inet" {inet=substr($2, 1, index($2,"/")-1); if (inets>"") inets=inets ","; inets=inets inet} END {outline()}'
可読性を高めるために分けて、
ip addr show |
awk '
# Output function to format results (if any)
function outline() {
if (link>"") {printf "%s %s %s\n", iface, inets, link}
}
# Interface section starts here
$0 ~ /^[1-9]/ {
outline(); # Output anything we previously collected
iface=substr($2, 1, index($2,":")-1); # Capture the interface name
inets=""; # Reset the list of addresses
link="" # and MAC too
}
# Capture the MAC
$1 == "link/ether" {
link=$2
}
# Capture an IPv4 address. Concatenate to previous with comma
$1 == "inet" {
inet=substr($2, 1, index($2,"/")-1); # Discard /nn subnet mask
if (inets>"") inets=inets ","; # Suffix existing list with comma
inets=inets inet # Append this IPv4
}
# Input processing has finished
END {
outline() # Output remaining collection
}
'
出力例
eth0 10.0.2.15 08:00:27:0f:db:b3
eth1 192.168.56.101 08:00:27:33:04:26