Fórum Root.cz
Hlavní témata => Software => Téma založeno: isko 06. 01. 2012, 12:02:59
-
Mám logovací soubor (zápisy ztrát packetů), ze kterého potřebuju vyfiltrovat řádky, kde jsou ztráty 1-100%. Používám na to AWK, ale nedaří se mi zachytit řádky, které mají 44%, 55%, 99%, 100% - zkrátka všude tam, kde se opakují číslice. Potřebuju:
1) poradit, proč se neodchytí tyhle hodnoty. Podotýkám, že program awk nezachytí ani hodnotu /100%/ či /99%/ natvrdo zadanou ve vzorku.
2) regulární výraz pro čísla 1-100%
Věděl by někdo, jak na to?
-
A proc nehodis do placu stavajici kod ktery ti nefunguje at se muzeme podivat, kde nechat tesar diru?
-
Tak už je to vyřešeno. Problém byl v tom, že řádky s údajem 100% mají jiný počet položek a díky nastaveným podmínkám mi to číslo vůbec nepřišlo do vstupu do awk. Teď už to mám upravené a na těch 1-100% mi funguje výraz [0-9][0-9][1-9]*%.
Díky za ochotu!
-
A nestacilo by [0-9]*%?
-
Tak už je to vyřešeno. Problém byl v tom, že řádky s údajem 100% mají jiný počet položek a díky nastaveným podmínkám mi to číslo vůbec nepřišlo do vstupu do awk. Teď už to mám upravené a na těch 1-100% mi funguje výraz [0-9][0-9][1-9]*%.
Skutečně projde i údaj 100%? Podle uvedeného regulárního výrazu by neměl.
-
Mne to taky prijde divne. V te treti zavorce prece chybi 0. Prvni a treti zavorka by mely byt prohozeny ne? A navic tam podle mne projdou jenom trojciferna cisla ne?
-
oprava: troj a vice ciferna cisla krome tech koncicich nulou :)
ale nejsem awk expert tak se klidne muzu plest.
-
Mne to taky prijde divne. V te treti zavorce prece chybi 0. Prvni a treti zavorka by mely byt prohozeny ne? A navic tam podle mne projdou jenom trojciferna cisla ne?
oprava: troj a vice ciferna cisla krome tech koncicich nulou :)
ale nejsem awk expert tak se klidne muzu plest.
Podle mne je to řádně domotáno. Ten regulární výraz funguje i pro 100%, protože ignoruje tu jedničku na začátku. Není tam znak '^' na začátku. Ale správně to není, i když to funguje. Je to docela hnusný hack.
-
a neznamena ten zapis [0-9][0-9][1-9]*% ze tam budou prave tri ci vice cislic? To by pak odporovalo i te tve teorii jinak by prece melo stacit ^[0-9]*% ne?
-
a neznamena ten zapis [0-9][0-9][1-9]*% ze tam budou prave tri ci vice cislic? To by pak odporovalo i te tve teorii jinak by prece melo stacit ^[0-9]*% ne?
Jenže přes takový regexp by prošlo i '8%', '0%' nebo jen '%' a to nechtěl. Chtěl filtrovat hodnoty >=10%.
-
Ja tam vidim: "2) regulární výraz pro čísla 1-100%". Nic o hodnotach vetsich jak deset tu nepadlo a nebo jsem slepej jak patrona. I kdyz je fakt ze pres tohle proleze i ta 0% ale to by slo resit nejakym NORem ne?
-
Ja tam vidim: "2) regulární výraz pro čísla 1-100%". Nic o hodnotach vetsich jak deset tu nepadlo a nebo jsem slepej jak patrona. I kdyz je fakt ze pres tohle proleze i ta 0% ale to by slo resit nejakym NORem ne?
Vidíš, mně ten jeho výraz funguje od 10% výše. Tak nějak jsem předpokládal, že to tak chtěl, aniž bych se podíval na původní dotaz.
-
;D jo takhle. No podle meho selskeho rozumu by to nemelo fungovat ani na tech 10%, ale nemam to ted kde vyzkouset. Hlavne mne mate ta tazatelova poznamka, ze se mu nezobrazovali ty hodnoty kde se opakovaly cislice. Nechapu, jakej by to na to melo vliv pri tom zapisu, leda by tam sam nepridal nejakej vyraz za to zodpovednej.
-
a neznamena ten zapis [0-9][0-9][1-9]*% ze tam budou prave tri ci vice cislic? To by pak odporovalo i te tve teorii jinak by prece melo stacit ^[0-9]*% ne?
Ja tam teda vidim hvezdicku, ktera IMHO znamena "libovolny pocet". Takze tomuhle RE IMHO vyhovi retezec 2 a vice cislic, pricemz:
- prvni a druha mohou byt 0 - 9
- kazda dalsi muze byt 1 - 9
- retezec nemusi temito cislicemi zacinat
- retezec hned za cislicemi obsahuje znak "procento"
- za procenterm muze retezec pokracovat.
-
a neznamena ten zapis [0-9][0-9][1-9]*% ze tam budou prave tri ci vice cislic? To by pak odporovalo i te tve teorii jinak by prece melo stacit ^[0-9]*% ne?
Jenže přes takový regexp by prošlo i '8%', '0%' nebo jen '%' a to nechtěl. Chtěl filtrovat hodnoty >=10%.
'8%', '0%' nebo jen '%' by IMHO pres tento RE urcitre neproslo, viz http://forum.root.cz/index.php?topic=3559.msg29765#msg29765
-
pres tohle proleze i ta 0% ale to by slo resit nejakym NORem ne?
Obavam se, ze '0%' pres to neprojde, protoze IMHO retezec musi mit dve nebo vice cislic nasledovanych znakem procento
-
podle meho selskeho rozumu by to nemelo fungovat ani na tech 10%
IMHO to prave na > 9% (cti 10 a vice) fungovat bude, protoze v tom logu asi nebude '05%', ale '5%', coz neprojde, protoze to ma jen 1 cislici. '10%' je nejnizsi cislo, ktere ma 2 cislice
-
Snad tri a vice pri zapisu [0-9][0-9][1-9]*% ne? nebo snad pri pouziti hvezdickove konvence se nemusi objevit vyraz ani jednou? To se mi nezda i kdyz mozne to je.
-
Snad tri a vice pri zapisu [0-9][0-9][1-9]*% ne? nebo snad pri pouziti hvezdickove konvence se nemusi objevit vyraz ani jednou? To se mi nezda i kdyz mozne to je.
Hvězdička skutečně znamená, že se předchozí regulární výraz nemusí vyskytnout ani jednou. Pro 1..n se používá '+'.
-
Díky za všechny příspěvky.
K jednotlivým vašim i dalším tipům, co jsem vyzkoušela:
^[0-9]*% => nedostanu nic
^[1-9]*% => nedostanu nic
[0-9]*% => dostanu řádky s 0-100%. Jenže to jsou vlastně všechny řádky z logu, který jsem chtěla filtrovat. Takže na nic.
[0-9][1-9]*% => dostanu 0-100%. DTTO
[0-9][1-9][0-9] => dostanu 10-100%.
[0-9][0-9][1-9]*% funguje.
Hvězdička znamená i nulový výskyt.
Problém s číslicemi typu 66%, 100% - jak už jsem se snažila upřesnit (možná špatně) byl způsobený tím, že do vstupu pro uvedené awk ty řádky s číslicemi 44, 66 a hlavně 100% vůbec nešly, zkrátka jsem špatně odfiltrovala vstupní data. Takže to padá, to už problém není.
Je možný, že jsem to krutě pomotala (je možný, že mám špatný linux?;-))), ale líp mi to fakt nešlo. A musím říct, že jsem se fakt snažila, dost jsem hledala na internetu, příkladů je všude milión, ale tohle konkrétní řešení jsem nenašla.
Takže tak, děkuju za reakce.
Jinak zápisy v logu vypadají takto:
2011-12-09 10:37:53
100 packets transmitted, 100 received, 0% packet loss, time 99119ms
rtt min/avg/max/mdev = 3.407/10.577/74.912/9.326 ms
a takto:
2011-12-12 11:38:56
100 packets transmitted, 0 received, +27 errors, 100% packet loss, time 99007ms
, pipe 2
(obojí najednou, podle toho, jak dopadne konkrétní ping)