» »

Regexp, grep, awk problem?

Regexp, grep, awk problem?

Matthai ::

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?
All those moments will be lost in time, like tears in rain...
Time to die.

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
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 ...
On the journey of life, I chose the psycho path.

Matthai ::

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?
All those moments will be lost in time, like tears in rain...
Time to die.

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...
On the journey of life, I chose the psycho path.

Zgodovina sprememb…

  • spremenil: Brane2 ()

Matthai ::

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
All those moments will be lost in time, like tears in rain...
Time to die.

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...
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 ::

O.K ?
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č?

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'

Zgodovina sprememb…

Jean-Paul ::

Baza telefonskih klicev?

Brane2 ::

Kaj je zdaj - dela, ne dela, popravimo/predelamo kaj ?
On the journey of life, I chose the psycho path.

Matthai ::

Brane2: zdajle sem stestiral in dela. Super, hvala ti.

Zdaj grem pa skušat razumet kaj si napisal :-)
All those moments will be lost in time, like tears in rain...
Time to die.

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)
On the journey of life, I chose the psycho path.

BigWhale ::

Brane, hm, vecino firewall pravil lahko obesis na interface, ne nucas IP stevilke?

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...
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.
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.
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...
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.
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.
On the journey of life, I chose the psycho path.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

regex

Oddelek: Programiranje
10851 (595) l0g1t3ch
»

[Slackware 10.2] Linux mašina kot router in switch

Oddelek: Omrežja in internet
8923 (850) drola
»

Url validation - Java Script

Oddelek: Programiranje
161037 (921) Trubadur
»

skripta v linuxu za izpis količino prometa

Oddelek: Programiranje
14851 (660) Gunn3r
»

Kako naredim preusmeritev???

Oddelek: Operacijski sistemi
7912 (802) 2nemesis

Več podobnih tem