Forum » Programiranje » Regexp, grep, awk problem?
Regexp, grep, awk problem?
poweroff ::
Imam veliko tekstovno datoteko, kjer imam podatke v različnih stolpcih, vendar pa se stolpci ne prekrivajo oz. se mi podatki, ki jih želim izpisati pojavljajo v različnih stolpcih.
skratka - rad bi izpisal vse nize, ki se nahajajo v obliki 123456xxxxx. "123456" so različne številke, vedno pa je nakoncu teh cifer niz "xxxxx".
Kako z regexpom (iz basha v Linuxu, se pravi cat, grep, awk,...) izpisati vse nize, ki vsebujejo šest cifer in potem pet x-ov?
skratka - rad bi izpisal vse nize, ki se nahajajo v obliki 123456xxxxx. "123456" so različne številke, vedno pa je nakoncu teh cifer niz "xxxxx".
Kako z regexpom (iz basha v Linuxu, se pravi cat, grep, awk,...) izpisati vse nize, ki vsebujejo šest cifer in potem pet x-ov?
sudo poweroff
Monster ::
js bi se tega lotil v tejle smeri ...
echo `expr "$string" : '[0-9]*.xxxxx'`
... kaj več koristnega bos pa nasel na tejle povezavi >> povezavi
echo `expr "$string" : '[0-9]*.xxxxx'`
... kaj več koristnega bos pa nasel na tejle povezavi >> povezavi
Ka zaboga...
Brane2 ::
To delaš z rezanjem spremenljivk.
Pogledaš, če lahko spremenljiki odrežeš vodilni ali repni del in nato ukrepaš v skaldu s tem.
Na primer:
my_other_var = "${my_var#[0-9][0-9][0-9][0-9][0-9][0-9][0-9]}ˇ
my_third_var = "${my_other_var%xxxxx}ˇ
[ "${my_third_var}" == "" ] && do_whatever ...
Pogledaš, če lahko spremenljiki odrežeš vodilni ali repni del in nato ukrepaš v skaldu s tem.
Na primer:
my_other_var = "${my_var#[0-9][0-9][0-9][0-9][0-9][0-9][0-9]}ˇ
my_third_var = "${my_other_var%xxxxx}ˇ
[ "${my_third_var}" == "" ] && do_whatever ...
On the journey of life, I chose the psycho path.
poweroff ::
OK, če rečem cat file.txt | grep '[0-9]*.xxxxx' mi izpiše vse vrstice kjer se nahajajo ti podatki. Kako pa potem iz basha spremenljivke razrežem?
sudo poweroff
Brane2 ::
Mi ne bi ti raje poslal kar fajl pa ti bom na brzino spesnil program ?
On the journey of life, I chose the psycho path.
Brane2 ::
Ali vsaj kak reprezentativni kos fajla ?
Ne rabiš ga grepat, daj ga raw, tak kot je...
Ne rabiš ga grepat, daj ga raw, tak kot je...
On the journey of life, I chose the psycho path.
Zgodovina sprememb…
- spremenil: Brane2 ()
poweroff ::
Hmm, ja. Čeprav gre za eno malce občutljivo zadevo. Ampak glede na to, da bo o tem članek, lahko objavim strukturo datoteke.
:-)
Z "-" so označeni poljubni znaki (gre za nek tekst). Problem je, ker se vsake toliko časa vrstice zalomijo, zato ni mogoče rezati besedila glede na stolpce.
Tole je datoteka (kot rečeno so podatki, ki bi jih rad odstranil označeni z -:
------- ---- 386404xxxxx --.--.---- -:-- ---
------- ---- 386404xxxxx --.--.---- -:-- ---
------- ---- 386313xxxxx --.--.---- -:-- ---
------- ---- 386404xxxxx --.--.---- -:-- ---
------- ---- 386404xxxxx --.--.---- -:-- ---
V bistvu bi rad dobil ven samo podatke v obliki
386404
386404
386313
386404
386404
Po možnosti bi to naredil z bashom. Problem je, če rečem:
cat file.txt | grep '[0-9]*.xxxxx' | awk '{print $3}'
Dobim ven med drugim tudi tole (ker se vrstice v datoteki lomijo):
386404xxxxx
386404xxxxx
15:24
386404xxxxx
386404xxxxx
:-)
Z "-" so označeni poljubni znaki (gre za nek tekst). Problem je, ker se vsake toliko časa vrstice zalomijo, zato ni mogoče rezati besedila glede na stolpce.
Tole je datoteka (kot rečeno so podatki, ki bi jih rad odstranil označeni z -:
------- ---- 386404xxxxx --.--.---- -:-- ---
------- ---- 386404xxxxx --.--.---- -:-- ---
------- ---- 386313xxxxx --.--.---- -:-- ---
------- ---- 386404xxxxx --.--.---- -:-- ---
------- ---- 386404xxxxx --.--.---- -:-- ---
V bistvu bi rad dobil ven samo podatke v obliki
386404
386404
386313
386404
386404
Po možnosti bi to naredil z bashom. Problem je, če rečem:
cat file.txt | grep '[0-9]*.xxxxx' | awk '{print $3}'
Dobim ven med drugim tudi tole (ker se vrstice v datoteki lomijo):
386404xxxxx
386404xxxxx
15:24
386404xxxxx
386404xxxxx
sudo poweroff
Brane2 ::
Ravnokar sem cufnil podatke dol, počćakaj malo...
On the journey of life, I chose the psycho path.
Brane2 ::
Čakaj malo. Pa je željeni podatek vedno tretja beseda v vrsti ?
Če je, je rešitev sploh simpl oneliner:
while read -a myvar; do echo ${myvar[2]%xxxxx}; done <my_text.txt
Če ni, beri naslednji post...
Če je, je rešitev sploh simpl oneliner:
while read -a myvar; do echo ${myvar[2]%xxxxx}; done <my_text.txt
Če ni, beri naslednji post...
On the journey of life, I chose the psycho path.
Brane2 ::
while read -a myvar; do for mv2 in ${myvar[@]}; do [ "${mv2%xxxxx}" != "${mv2}" ] && echo ${mv2%xxxxx}; done ; done<my_text.txt
On the journey of life, I chose the psycho path.
Brane2 ::
Stvar reesda ne preverja, če so preostali karakterji res številke in če jih je šest, ampak primerov, kjer bi to rabil v tem tvojem vzorcu ni videti, poleg tega pa to lahko enostavno dodam, če boš rabil...
On the journey of life, I chose the psycho path.
ježek ::
Morda kaj takega
while read line
do
echo `expr "$line" : '.* \([0-9]\{6,6\}\)x\{5,5\}'`
done
shraniš v npr. bla in potem uporabiš ./bla < myfile.txt
Mimogrede; slabo sem te razumel, je lahko v vsaki vrstici največ ena taka številka, ali jih je lahko več?
while read line
do
echo `expr "$line" : '.* \([0-9]\{6,6\}\)x\{5,5\}'`
done
shraniš v npr. bla in potem uporabiš ./bla < myfile.txt
Mimogrede; slabo sem te razumel, je lahko v vsaki vrstici največ ena taka številka, ali jih je lahko več?
Jean-Paul ::
Še moj prispevek:
grep -o '[0-9]\{6\}x\{5\}' aaa.txt
In še odstranitev x-ov:
grep -o '[0-9]\{6\}x\{5\}' aaa.txt |sed '/x\{6\}$/d'
grep -o '[0-9]\{6\}x\{5\}' aaa.txt
In še odstranitev x-ov:
grep -o '[0-9]\{6\}x\{5\}' aaa.txt |sed '/x\{6\}$/d'
Zgodovina sprememb…
- spremenil: Jean-Paul ()
Brane2 ::
Kaj je zdaj - dela, ne dela, popravimo/predelamo kaj ?
On the journey of life, I chose the psycho path.
poweroff ::
Brane2: zdajle sem stestiral in dela. Super, hvala ti.
Zdaj grem pa skušat razumet kaj si napisal :-)
Zdaj grem pa skušat razumet kaj si napisal :-)
sudo poweroff
Brane2 ::
Cela fora igranja s spremenljivkami v bashu so ti ${my_var#odrezati} in podobne zadeve.
Ko se naučiš operirati z njimi, lahko izpelješ marsikaj brez posebnih orodij.
Ko sem se uštekal na siolovo optiko recimo sem imel problem s pisanjem firewall pravil, ker sem imel odem postavljen v načinu router, ki je moji mašini dodelil IP (dhcp).
Doslej sem bil vajenn T-2ja, kjer sem imel statični Ip in sem lahko vse spremenljivke ( IPje, maske itd) vnesel ročno.
Sedaj pa je kaplja prelila kozarec in sem na brzino ( ajde v pol ure ali kaj takega) rodil par funkcij v bashu, ki so za dano ime kartice postavile v spremenljivke njen številčni IP, masko, IP mreže, broadcast in izračunale številčno oznako maske- če imaš recimo na eth0 IP 123.456.789.012 in masko 255.255.255.0 si dobil ETH0_IP=123.456.789.012, ETH0_MASK=255.255.255.0, ETH0_MASKNUM=24, ETH0_NET=123.456.789.0 ETH0_BRD=123.456.789.255 ( če je broadcast nastavljen).
Vse z nekaj kratkimi funkcijami, ki so zagnale ifconfig in sparsale rezultat...
Bash je sicer v kameni dobi, vendar se da tudi z njim marsikaj naredit... ;o)
Ko se naučiš operirati z njimi, lahko izpelješ marsikaj brez posebnih orodij.
Ko sem se uštekal na siolovo optiko recimo sem imel problem s pisanjem firewall pravil, ker sem imel odem postavljen v načinu router, ki je moji mašini dodelil IP (dhcp).
Doslej sem bil vajenn T-2ja, kjer sem imel statični Ip in sem lahko vse spremenljivke ( IPje, maske itd) vnesel ročno.
Sedaj pa je kaplja prelila kozarec in sem na brzino ( ajde v pol ure ali kaj takega) rodil par funkcij v bashu, ki so za dano ime kartice postavile v spremenljivke njen številčni IP, masko, IP mreže, broadcast in izračunale številčno oznako maske- če imaš recimo na eth0 IP 123.456.789.012 in masko 255.255.255.0 si dobil ETH0_IP=123.456.789.012, ETH0_MASK=255.255.255.0, ETH0_MASKNUM=24, ETH0_NET=123.456.789.0 ETH0_BRD=123.456.789.255 ( če je broadcast nastavljen).
Vse z nekaj kratkimi funkcijami, ki so zagnale ifconfig in sparsale rezultat...
Bash je sicer v kameni dobi, vendar se da tudi z njim marsikaj naredit... ;o)
On the journey of life, I chose the psycho path.
Brane2 ::
Večino, nisem pa našel načina za vse. Poleg tega imam rad pravila v stilu zavrzi vsak paket, ki je prišel po eth0, vendar nima ciljnega naslova ETH0_IP ( torej ni namenjen meni )
ali recimo moji mrežni skupini, ki velja za eth0.
Ali recimo, če je paket prišel po eth0 in je namenjen točno določenemu IPju neke mašine na mreži, na kateri je eth2, naredi XYZ...
ali recimo moji mrežni skupini, ki velja za eth0.
Ali recimo, če je paket prišel po eth0 in je namenjen točno določenemu IPju neke mašine na mreži, na kateri je eth2, naredi XYZ...
On the journey of life, I chose the psycho path.
Zgodovina sprememb…
- spremenil: Brane2 ()
Thomas ::
Jaz bi vzel UltraEditor. Uporabljal UltraEditor in njegov macro language za takele operacije.
Samo sugestija.
Samo sugestija.
Man muss immer generalisieren - Carl Jacobi
Brane2 ::
Fora je v tem, da na Linux sistemih imaš vedno pri roki vsaj Bash, v zadnjih nekaj letih pa praktično vedno vsaj Python, ki bi ga v vlogi orodja iz železnega repertoarja komot zamenjal.
Nadrkaš Ruby, Perl, Python, PHP ali kaj sedmega in piči miško.
kar se ultraeditorja tiče, nisem probal ampak ni videt, da to lahko vedno zamnenja tovrstna orodja, ker dostikrat recimo nimaš grafičnega izhoda, ali pa mogoče recimo čakaš na nekem portu neke podatke, ki jih na brzino sfriziraš in pošlješ po drugem nazaj itd - torej ne gre vedno za I/O na klasičnih datotekah pa tudi kot rečeno, nimaš vedno na voljo klasičnega terminalskega ali grafičnega okna na stroju, kjer se program izvaja.
Nadrkaš Ruby, Perl, Python, PHP ali kaj sedmega in piči miško.
kar se ultraeditorja tiče, nisem probal ampak ni videt, da to lahko vedno zamnenja tovrstna orodja, ker dostikrat recimo nimaš grafičnega izhoda, ali pa mogoče recimo čakaš na nekem portu neke podatke, ki jih na brzino sfriziraš in pošlješ po drugem nazaj itd - torej ne gre vedno za I/O na klasičnih datotekah pa tudi kot rečeno, nimaš vedno na voljo klasičnega terminalskega ali grafičnega okna na stroju, kjer se program izvaja.
On the journey of life, I chose the psycho path.
Thomas ::
Hja, v špartanskih okoljih je pa sigurno UE nedosegljiv. Sicer pa lahko počneš vse takele zadeve z njim.
Man muss immer generalisieren - Carl Jacobi
Brane2 ::
Fajn, če dela. Samo jaz ga na Linuxu nimam, imam pa kup drugih, standardnih orodij.
Python je recimo zadosti dober, da lahko dobiš na njemu napisano vse živo, vključno s kakim spletnim strežnikom itd, obenem pa je lep in simpl, pa nima dodatneih stvari v sebi in ga lahko sparim z editorjem po želji.
Njegove knjižnice so obsežne in se grem z njim lahko praktično karkoli, tudi 3D animacijo.
Zame zadosti dobro, sploh če gre za standardno orodje.
Če bi šel v kaj proprietary, rabim zadosti velik "nadstandard" in potrebo po njem.
KAr se Basha tiče, je sicer res iz kamene dobe, vendar je z njim nekako tako kot recimo z BIOSom- resda se vleče s polepšavami že skoraj 30 let od prvih PCjev, vendar brez njega ne moreš. No, dokler ga ne bo defacto nasledil EFI, a do tega je še nekaj.
In ko ga že imaš, ni nobene škode, če ga tudi znaš uprabljati...
Python je recimo zadosti dober, da lahko dobiš na njemu napisano vse živo, vključno s kakim spletnim strežnikom itd, obenem pa je lep in simpl, pa nima dodatneih stvari v sebi in ga lahko sparim z editorjem po želji.
Njegove knjižnice so obsežne in se grem z njim lahko praktično karkoli, tudi 3D animacijo.
Zame zadosti dobro, sploh če gre za standardno orodje.
Če bi šel v kaj proprietary, rabim zadosti velik "nadstandard" in potrebo po njem.
KAr se Basha tiče, je sicer res iz kamene dobe, vendar je z njim nekako tako kot recimo z BIOSom- resda se vleče s polepšavami že skoraj 30 let od prvih PCjev, vendar brez njega ne moreš. No, dokler ga ne bo defacto nasledil EFI, a do tega je še nekaj.
In ko ga že imaš, ni nobene škode, če ga tudi znaš uprabljati...
On the journey of life, I chose the psycho path.
Brane2 ::
Še nekaj, kar se kompaktnosti tiče. Za Python se ne spomnim ampak vsaj bash ( ali je to bil navaden sh ?) sem videl recimo na navadnem prdcu od Linksysovega Wifi Access pointa, ko je tip odprl zadev, nanjo zalotal seriski konekotr in se telnetal gor ter padel v Bash.
Sploh ne dvomimim, da bi na tako zadevi lahko pognal recimo Python. Meni je recimo Bash laufal povsem lepo v ukazni vrstici na Sharp ZAurusu- mislim da prvem Linux dlančniku.
Pythona se ne spomnim ampak ne dvomim da bi ga spravil gor.
Linux okolje najdeš že povsod in te zadeve so nekakšen standard v tem okolju.
Zdaj mogoče bi na Zaurusa spravil UE a tu pridemo do vprašanja koliko to okolje omogoča.
Sploh ne dvomimim, da bi na tako zadevi lahko pognal recimo Python. Meni je recimo Bash laufal povsem lepo v ukazni vrstici na Sharp ZAurusu- mislim da prvem Linux dlančniku.
Pythona se ne spomnim ampak ne dvomim da bi ga spravil gor.
Linux okolje najdeš že povsod in te zadeve so nekakšen standard v tem okolju.
Zdaj mogoče bi na Zaurusa spravil UE a tu pridemo do vprašanja koliko to okolje omogoča.
On the journey of life, I chose the psycho path.
Brane2 ::
Pa da ne bo pomote, pojma nimam o Pythonu. Pznam ga le skozi učinke programov, ki sem jih videl napisanih na njem, skozi to kar o njem govorijo in skozi nekaj tutorialov, ki sem jih dal svojčas skozi zanj.
Doslej mi je za take quick one-offe zadoščal bash, za malo resnejše stvari pa je zaenkrat v ospredju C.
Doslej mi je za take quick one-offe zadoščal bash, za malo resnejše stvari pa je zaenkrat v ospredju C.
On the journey of life, I chose the psycho path.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Linux Share network connectionOddelek: Pomoč in nasveti | 1225 (1101) | hojnikb |
» | Webmin errorOddelek: Operacijski sistemi | 2264 (1771) | xtrat |
» | iz dhcp v fiksni ipOddelek: Omrežja in internet | 1900 (1608) | Good Guy |
» | skripta v linuxu za izpis količino prometaOddelek: Programiranje | 1284 (1093) | Gunn3r |
» | freescoOddelek: Omrežja in internet | 1812 (1638) | mile |