Portál AbcLinuxu, 13. května 2025 23:50
Poradil mi někdo, jak z této jedné řádky:
NETIF="if=eth0,mac=00:18:51:B8:85:A1,host_ifname=veth432.0,host_mac=00:18:51:35:E4:6F;ifname=eth1,mac=00:18:51:A6:0D:BE,host_ifname=veth432.1,host_mac=00:18:51:9E:67:62;ifname=eth4,bridge=br0,mac=00:18:51:2D:A2:E3,host_ifname=veth432.4,host_mac=00:18:51:AE:25:A8;ifname=eth5,bridge=br0,mac=00:18:51:3D:52:CA,host_ifname=veth432.5,host_mac=00:18:51:5F:E0:CF"
získat nejlépe tento výsledek:
br0 veth432.5 br0 veth432.5
Přeloženo do češtiny - vypsat všechna veth rozhraní, která jsou v bridge a v jakém.
Já jsem se zatím dal dohromady toto:
sed 's#.*bridge=\(.*\),mac=.*,host_ifname=\(.*\),host_mac=.*#\1 \2#'
čímž získám:
br0 veth432.5
...což je poslední výskyt, ale já bych potřeboval všechny výskyty... Předem díky.
Řešení dotazu:
Šel, ale nenapadá mne, jak to v něm poskládat...
gawk ' BEGIN{ORS=" ";FS=",";br=0;} { for(i=1; i < NF; i++) { if(match($i, /bridge/)) { print substr($i,8); br=1; } if(match($i, /host_ifname/)) { if(br==1){ print substr($i,13); br=0; } } } }'
net=(${NETIF//,/ }) for((i = 0; i < ${#net[*]}; i++)); do x=${net[$i]} if [[ "$x" =~ bridge ]]; then ((i+=2)) veth=${net[i]} echo -n "${x#bridge=} ${veth#host_ifname=} " fi done echoMá to několik zjednodušení, který předpokládaj určitej formát, pokud to není to co chceš, zkusíme to vylepšit. AFAIK na tohle
sed
není dost robustní.
To je přesně to, co potřebuji! Díky. Koukám, že se mám ještě co učit.
K tomu skriptu:
1) chápu dobře že první řádka provede explode hodnot oddělených čárkou do pole?
2) není mi úplně jasno, co dělá ${x#bridge=}
sed 's/bridge=/\n&/g' | sed -n 's#.*bridge=\(.*\),mac=.*,host_ifname=\(.*\),host_mac=.*#\1 \2#p'
v perlu by to šlo třeba takhle:
perl -ne '@a = $_ =~ /bridge=([^,]*),.*?,host_ifname=([^,]*)/g; print "@a"'
resp.
perl -ne 'print join " ",(/bridge=([^,]*),.*?,host_ifname=([^,]*)/g);'
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.