Portál AbcLinuxu, 27. dubna 2024 02:07


Dotaz: sed/awk efektivita

honzous avatar 7.7.2008 15:32 honzous | skóre: 17 | blog: /var/log/honzous.log
sed/awk efektivita
Přečteno: 401×
Odpovědět | Admin
Zdravim,

Prave jsem potreboval prostripovat jeden log a narazil jsem urcitou zabranu. Prozatim vzdy jsem to resil takovym osklivym "hackem", ale jsem si jisty, ze na to existuje efektivnejsi reseni. Akorat jsem lenivy prochazet vsechny mozne manualy, a tak se ptam komunity, nekdo z vas uz neco podobneho urcite resil a ma na to sve reseni.

Potrebuji z jednoho logu dostat pouze urcitou hodnotu, ktera je uvozena pomoci r=hodnota (hodnota je vetsinou IP nebo domena). Ostatni zaznamy jsou oddeleny mezerou. Kazdy radek v logu ma variabilni pocet sloupcu, takze moje r= se neza zachytit statickym awk print $cislo.

Moje osklive reseni:

grep r\= pozadovany_log | sed -e s/^.*\ r\=//g | awk '{ print $1 }' Osklive, ale funguje. Zna nekdo lepsi zpusob?

Dik
Nevykej mi, ja ti taky nebudu vykat...↵ Mar 13 11:53:32 nevykat last message repeated 2324661 times
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

7.7.2008 15:54 Miška | skóre: 31 | Praha
Rozbalit Rozbalit vše Re: sed/awk efektivita
Odpovědět | | Sbalit | Link | Blokovat | Admin
cat log | sed -n 's|.*r=\([^[:blank:]]*\)[[:blank:]].*|\1|p'
Samozrejme experimentalne otestovat a doladit
stativ avatar 7.7.2008 16:06 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: sed/awk efektivita
ten cat není potřeba
Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
7.7.2008 15:55 #Tom | skóre: 32 | blog: Inspirace, aneb co jsem kde vyhrabal
Rozbalit Rozbalit vše Re: sed/awk efektivita
Odpovědět | | Sbalit | Link | Blokovat | Admin
Osobně bych se pokusil napsat regulární výraz tak, abych si vystačil jen se sedem a grepem:
grep "r=" protokol |  sed "s/.*r=\([a-zA-Z0-9.]*\).*/\1/"
Najdu tedy řádky obsahující r= a vyberu jen to, co následuje za tímto řetězcem a skládá se z písmen, číslic a teček, což zachytí jak DNS záznamy, tak IPv4 adresy. Pokud jsou tam i IPv6, je třeba doplit dvojtečku. Příkaz počítá s tím, že na jednom řádku se r= vyskytuje pouze jedenkrát, pokud tomu tak není, vypíše hodnotu u posledního z nich.
7.7.2008 16:19 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: sed/awk efektivita

A ještě to jde zkrátit :-). sed umí i vyhledávat a tisknout jen na požádání:

sed -n "/r=/s/.*r=\([a-zA-Z0-9.]*\).*/\1/p"
Příkaz počítá s tím, že na jednom řádku se r= vyskytuje pouze jedenkrát, pokud tomu tak není, vypíše hodnotu u posledního z nich.

Pokud by to byl problém, tak by tohle mohlo fungovat:

sed 's/r=/\nr=/g' | sed ...
I am always ready to learn although I do not always like to be taught. (W. Churchill)
7.7.2008 16:22 #Tom | skóre: 32 | blog: Inspirace, aneb co jsem kde vyhrabal
Rozbalit Rozbalit vše Re: sed/awk efektivita
Díky za doplnení. :-)
stativ avatar 7.7.2008 16:02 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: sed/awk efektivita
Odpovědět | | Sbalit | Link | Blokovat | Admin
Já bych to udělal asi takhle:
grep r\= neco| sed 's/.*r\=\([^\ ]*\)\ .*/\1/g'
Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
stativ avatar 7.7.2008 16:06 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: sed/awk efektivita
Sakra, než jsem dočetl dotaz, už mě předběhli. Nicméně Miskovo řešení je nejlepší – nepoužívá grep a hlavně díky třídě [:blank:] si dovede poradit i s jinými oddělovači než je mezera.
Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
honzous avatar 7.7.2008 18:07 honzous | skóre: 17 | blog: /var/log/honzous.log
Rozbalit Rozbalit vše Re: sed/awk efektivita
Odpovědět | | Sbalit | Link | Blokovat | Admin
Diky vsem za rady. Byl jsem presvedcen, ze nekdo prijde s jinou logikou, tedy necim misto smazani vseho, co je pred r= a vyexportovani prvniho sloupce v tom, co zbude. Ale to uz by pak asi nebyl one-liner :-)
Nevykej mi, ja ti taky nebudu vykat...↵ Mar 13 11:53:32 nevykat last message repeated 2324661 times
7.7.2008 19:26 Jan Šimák | skóre: 37 | Hradec Králové
Rozbalit Rozbalit vše Re: sed/awk efektivita
Odpovědět | | Sbalit | Link | Blokovat | Admin
gawk -F 'r=' '/r\=/ { print $2 }' vstup.log | gawk '{ print $1 }'
možná to zle řešit pomocí jednoho awk, ale netuším jak :-)

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.