Portál AbcLinuxu, 1. listopadu 2025 11:53
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
echo
Má 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.