Portál AbcLinuxu, 13. května 2025 23:50

Dotaz: Mnohonásobné vyhledávání regulárního výrazu sedem

Zdeněk Zámečník avatar 29.4.2009 17:46 Zdeněk Zámečník | skóre: 26
Mnohonásobné vyhledávání regulárního výrazu sedem
Přečteno: 236×
Odpovědět | Admin

 

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:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

kozzi avatar 29.4.2009 18:14 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: Mnohonásobné vyhledávání regulárního výrazu sedem
Odpovědět | | Sbalit | Link | Blokovat | Admin
nesel by pouzit awk?
Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
Zdeněk Zámečník avatar 29.4.2009 18:15 Zdeněk Zámečník | skóre: 26
Rozbalit Rozbalit vše Re: Mnohonásobné vyhledávání regulárního výrazu sedem

Šel, ale nenapadá mne, jak to v něm poskládat...

kozzi avatar 29.4.2009 18:57 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: Mnohonásobné vyhledávání regulárního výrazu sedem
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;
			}
		}
		
	}
}'
Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
David Watzke avatar 29.4.2009 18:24 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Mnohonásobné vyhledávání regulárního výrazu sedem
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jestli to nemusí bejt v sedu, použil bych čistej bash... Tu proměnnou NETIF si nastav a pak spusť
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í.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
Zdeněk Zámečník avatar 29.4.2009 18:40 Zdeněk Zámečník | skóre: 26
Rozbalit Rozbalit vše Re: Mnohonásobné vyhledávání regulárního výrazu sedem

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=}

David Watzke avatar 29.4.2009 18:48 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Mnohonásobné vyhledávání regulárního výrazu sedem
1) jo
2) usekne ze začátku proměnný text "bridge="
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
29.4.2009 18:36 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: Mnohonásobné vyhledávání regulárního výrazu sedem
Odpovědět | | Sbalit | Link | Blokovat | Admin
nasekat podla "bridge=" na samostatne riadky a potom prehnat tym co uz mas (neuspesne riadky nevypisovat):
sed 's/bridge=/\n&/g' |
sed -n 's#.*bridge=\(.*\),mac=.*,host_ifname=\(.*\),host_mac=.*#\1 \2#p'
If you hold a Unix shell up to your ear, you can you hear the C.
wamba avatar 29.4.2009 19:23 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Mnohonásobné vyhledávání regulárního výrazu sedem
Odpovědět | | Sbalit | Link | Blokovat | Admin

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);'
 

This would have been so hard to fix when you don't know that there is in fact an easy fix.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.