lunedì 13 ottobre 2008

mysqldump singole insert

Le versioni più recenti di mysqldump creano una insert multipla per gruppi di insert simili. Ad esempio con mysqldump si ottiene:


INSERT INTO `events` VALUES (6582,11,'1223390359:164321',6285,'bla bla bla',10,'2008-10-07 16:39:21','bank_id=60702&charge_id=079208%409001914','BA8CF7E8-947D-11DD-8B00-488D047A8996',NULL,NULL,'079208@9001914'),(6583,11,'1223390362:164327',NULL,'bla bla bla',10,'2008-10-07 16:39:22','bank_id=60702&charge_id=079208%409001914','BB3FCB48-947D-11DD-9E00-488D047A8996',NULL,NULL,'079208@9001914'), ...

aggiungendo il parametro

--extended-insert=false si ottiene

INSERT INTO `events` VALUES (6582,11,'1223390359:164321',6285,'bla bla bla',10,'2008-10-07 16:39:21','bank_id=60702&charge_id=079208%409001914','BA8CF7E8-947D-11DD-8B00-488D047A8996',NULL,NULL,'079208@9001914');
INSERT INTO `events` VALUES (6583,11,'1223390362:164327',NULL,'bla bla bla',10,'2008-10-07 16:39:22','bank_id=60702&charge_id=079208%409001914','BB3FCB48-947D-11DD-9E00-488D047A8996',NULL,NULL,'079208@9001914');
INSERT INTO `events` VALUES (6584,11,'1223390943:167153',NULL,'bla bla bla',10,'2008-10-07 16:49:04','bank_id=60702&charge_id=079208%409001914','15DA559A-947F-11DD-B959-D093047A8996',NULL,NULL,'079208@9001914');

venerdì 3 ottobre 2008

Perl Oneliner

Talvolta mi capitano log del tipo:

2008-10-03 09:28:55,204 [10544] Dada::Rufus INFO final status: @101: uid:'+919791100668' appid:'122301909010729816767' : 'book' -> 'ACK' in 1.120 s.
2008-10-03 09:28:56,320 [9779] Dada::Rufus INFO final status: @56: uid:'+557988275004' appid:'122301908814163698835' : 'book' -> 'NACK' in 4.345 s.
2008-10-03 09:28:57,572 [10551] Dada::Rufus INFO final status: @101: uid:'' appid:'122301909010729816767' : 'capture' -> 'NACK' in 2.106 s.

supponiamo che voglia sapere quali diversi tipi di occorrenza del tipo '@...' ci siano.

In questo caso è semplice perché ce ne sono 2

@101 e @56

ma se il log è lungo parecchie centinaia di mega la cosa non è semplice.

Questa cosa, con le coreutils di linux si possono compiere velocemente, ancor più velocemente usando perl.

per estrarre dalle righe le varie etichette eseguo per da riga di comando facendo tornare con un'espressione regolare le parole che iniziano con '@':

perl -ne ' print "$1\n" if ($_=~/@(\w+)/)'

quindi supponendo che queste righe siano nel mio file di log utilizzo

cat filelog| perl -ne ' print "$1\n" if ($_=~/@(\w+)/)'

però così facendo ottengo una serie di

@101
@56
@101
@...

io voglio conoscere le occorrenze uniche e per questo ecco 2 utilità che tornano alla mano sort e uniq

quindi il mio comando diviene

perl -ne ' print "$1\n" if ($_=~/@(\w+)/)' | sort | uniq

e ottengo la lista di occorrenze uniche ricercata

N.B. per ottenere questo risultato non è necessario ricorrere al perl infatti spesso viene utilizzato awk. Per me l'utilizzo di awk se non per le cose più semplici è molto criptico e, conoscendo perl, preferisco utilizzarlo al suo posto.