Re: query complicata con espressioni regolari
Scusate il top quoting.
Quello che subito non mi piace di questo script è che apri e chiudi troppe volte la
connessione
Se ti tirassi fuori tutti i record in un CSV con una select unica logicamente simile a
select post_id, post_username, post_text from phpbb_posts
in cui concateni in modo opportuno i valori delle colonne in modo da avere un CSV
valido, facessi la tua elaborazione creando un file contenente una serie di statement di
update e alla fine processassi tutti gli statement con una sola invocazione del
comando mysql, beh penso che con 400.000 record la differenza si dovrebbe sentire
anche se mysql contatta il server su 127.0.0.0 o Unix pipe.
Poi arricchirei la query per vedere se riesco a trovare i post scritti dall'utente
Pincopanco contenenti la stringa "[quote]Pincopanco". Le ricerche full text usualmente
non sono il massimo della forza di un DB - rispetto ad altri tipi di match - ma mi pare
che abbiano arricchito i DB di funzioni diverse da live fatte proprio per la ricerca di
pattern nei clob.
Non mi piacciono tantissimo nemmeno i trigger. Io userei awk. Mi sa che te la cavi con
meno processi.
Se però il testo del post contiene degli <EOL> casca il palco dei CSV che hanno un
solo record per riga.
In quel caso mi ricupererei il sorgente dello script ad di Kernighan e Pike e vedrei di
sfruttare quello - e magari le stored procedure di mysql - per fare una connessione al
DB per leggere i dati ed una per scriverli.
Un ultima cosa. Lo script per cambiare le password, così come è, va bene se è solo se
è uno shell script via invocato via riga di comando da te. Se lo dai anche in mano
anche a me io per lo meno ti cancello tutte le password :) :) :) (no, certi atti vandalici
gratuiti non hanno senso, per me non vale la pena perderci tempo). Dicono che ci
siano cose chiamate sql injections :) :) :). E non avete idea di cosa può fare il più
incapace degli script kid col comando sqlmap.
--
Gian Uberto "saint" Lauri
inviata da un tablet
> On 14 Feb 2015, at 02:30, MaX <maxlinux2000@gmail.com> wrote:
>
> ok, mi riposnto da solo... ecco lo scrit funzionante... non ho ancora
> fatto le prove di carico... ma ad occhio 癡 rapido, per lo meno nei
> test
>
> ----------------------
>
> #!/bin/bash
> #exit
> source config.conf
>
> max_post_id=$(mysql --database="$MYDB" --user=$USER
> --password="$PASSWD" -e "SELECT MAX(post_id) AS post_id FROM
> phpbb_posts;"
> )
> #"
> max_post_id=$(echo $max_post_id | sed 's|^post_id ||')
> echo max_post_id=$max_post_id # numero da usare per il ciclo for o while
>
> # solo per test test
> #max_post_id=$1
>
> while [ $max_post_id -gt 0 ]; do # ciclo while ecluso per test
> post_username=$(mysql --database="$MYDB" --user=$USER
> --password="$PASSWD" -e "SELECT post_username FROM phpbb_posts WHERE
> post_id= $max_post_id;")
> post_username=$(echo $post_username | sed 's|^post_username ||')
> echo "#######################################################################"
> echo max_post_id=$max_post_id
> echo post_username=$post_username
>
> post_text=$(mysql --database="$MYDB" --user=$USER
> --password="$PASSWD" -e "SELECT post_text FROM phpbb_posts WHERE
> post_id
> = $max_post_id;")
> post_text=$(echo $post_text | sed 's|^post_text ||')
>
> # echo $post_text
>
> Trigger=$(echo $post_text | sed 's|<br>|\n|g' | sed
> "s|\[quote\]$post_username,\([0-9/]*\), \([0-9:]*\)\]|AA#AA|"
> | grep AA#AA)
> # echo Trigger1=$Trigger
>
> if [ -z $Trigger ]; then
> Trigger=$(echo $post_text | sed "s|Data originale: \([0-9-]*\)
> \([0-9:]*\),<br><br>\[quote:\([a-zA-Z0-9]*\)\]$post_username,\([0-9/]*\),
> \([0-9:]*\)\]|AA#AA|I" | sed 's|<br>|\n|g' | grep AA#AA )
> # echo Trigger2=$Trigger
> fi
> if [ -z $Trigger ]; then
> Trigger=$(echo $post_text | sed "s|Data originale: \([0-9-]*\)
> \([0-9:]*\),<br><br>\[quote\]$post_username,\([0-9/]*\),
> \([0-9:]*\)\]|AA#AA|" | sed 's|<br>|\n|g' | grep AA#AA | uniq)
> # echo Trigger3=$Trigger
> fi
> if [ $Trigger = "AA#AA" ] 2>/dev/null ; then
> new_post_text=$(echo $post_text | sed
> "s|\[quote:\([a-zA-Z0-9]*\)\]$post_username,\([0-9/]*\),
> \([0-9:]*\)\]<br>||I" | sed 's|\"|\\"|g')
> new_post_text=$(echo $new_post_text | sed "s|Data originale:
> \([0-9-]*\) \([0-9:]*\),<br><br>\[quote\]$post_username,\([0-9/]*\),
> \([0-9:]*\)\]<br>|Data Originale: \1 \2<br><br>|I" | sed 's|\"|\\"|g'
> )
> new_post_text=$(echo $new_post_text | sed "s|Data originale:
> \([0-9-]*\) \([0-9:]*\),<br><br>\[quote:\([a-zA-Z0-9]*\)\]$post_username,\([0-9/]*\),
> \([0-9:]*\)\]|Data Originale: \1 \2<br>|I")
> new_post_text=$(echo $new_post_text | sed
> 's|\[url-local:\([a-zA-Z0-9]*\)\]attachment/\([a-zA-Z0-9_#&%.;]*\)\[/url-local:\([a-zA-Z0-9]*\)\]||')
> # echo $new_post_text
> mysql --database="$MYDB" --user="$USER" --password="$PASSWD" -e
> "UPDATE phpbb_posts SET post_text = \"$new_post_text\" WHERE post_id =
> \"$max_post_id\""
> else
> echo "####################################
> lascio inalterato"
> fi
> let max_post_id=max_post_id-1
> done
>
> exit
>
> ----------------------
>
> ciao
> MaX
>
> 2015-02-13 21:08 GMT+01:00, MaX <maxlinux2000@gmail.com>:
>> mmmm ho fatto alcune correzzioni a questa bozza.
>> Quello che mi scoccia 癡 che lavorando cos穩 va a aggiornare tutti i
>> post del database, sia che siano da modificare o meno.
>> Bisognerebbe trovare il modo per detectare che il post 癡 da moficicare
>> e poi mettere una condizione if
>>
>> -----------------------
>>
>> #!/bin/bash
>> source config.conf
>>
>> max_post_id=$(mysql --database="$MYDB" --user=$USER
>> --password="$PASSWD" -e "SELECT MAX(post_id) AS post_id FROM
>> phpbb_posts;")
>> #"
>> max_post_id=$(echo $max_post_id | sed 's|^post_id ||')
>> echo max_post_id=$max_post_id # numero da usare per il ciclo for o while
>>
>> # solo per test test
>> #post_id=100000
>>
>> while [ $max_post_id = 0 ]; do # ciclo while ecluso per test
>> post_username=$(mysql --database="$MYDB" --user=$USER
>> --password="$PASSWD" -e "SELECT post_username FROM phpbb_posts WHERE
>> post_id= $max_post_id;")
>> post_username=$(echo $post_username | sed 's|^post_username ||')
>> echo post_username=$post_username
>>
>> post_text=$(mysql --database="$MYDB" --user=$USER
>> --password="$PASSWD" -e "SELECT post_text FROM phpbb_posts WHERE
>> post_id= $max_post_id;")
>> post_text=$(echo $post_text | sed 's|^post_text ||')
>>
>> new_post_text=$(echo $post_text | sed
>> "s|\[quote:\([a-zA-Z0-9]*\)\]$post_username,\([0-9/]*\),
>> \([0-9:]*\)\]<br>||I")
>> echo $new_post_text
>> mysql --database="$MYDB" --user="$USER" --password="$PASSWD" -e
>> "UPDATE phpbb_posts SET post_text = \"$new_post_text\" WHERE post_id =
>> \"$max_post_id\""
>>
>> let max_post_id=max_post_id-1
>> done
>>
>> exit
>>
>>
>>
>>
>> -----------------------
>>
>> Il 13/02/15, MaX<maxlinux2000@gmail.com> ha scritto:
>>> opss rileggento ho visto un errore:
>>>
>>> while [ $post_id = 0 ]; do --> while [ $max_post_id = 0 ]; do
>>>
>>> Il 13/02/15, MaX<maxlinux2000@gmail.com> ha scritto:
>>>> pensavo di fare una cosa del genere, ma si tratta di 400.000 post, e
>>>> non si se 癡 abbastanza veloce
>>>>
>>>> --------------------------------------
>>>> source config.conf
>>>>
>>>> post_id=$(mysql --database="$MYDB" --user=$USER --password="$PASSWD"
>>>> -e "SELECT MAX(post_id) AS post_id FROM phpbb_posts;")
>>>>
>>>> max_post_id=$(echo $post_id | sed 's|^post_id ||')
>>>> #echo max_post_id=$max_post_id # numero da usare per il ciclo for o
>>>> while
>>>>
>>>> while [ $post_id = 0 ]; do
>>>>
>>>> post_username=$(mysql --database="$MYDB" --user=$USER
>>>> --password="$PASSWD" -e "SELECT post_username FROM phpbb_posts WHERE
>>>> post_id= $post_id;")
>>>> post_username=$(echo $post_username | sed 's|^post_username ||')
>>>> # echo post_username=$post_username
>>>>
>>>> post_text=$(mysql --database="$MYDB" --user=$USER
>>>> --password="$PASSWD" -e "SELECT post_text FROM phpbb_posts WHERE
>>>> post_id= $post_id;")
>>>> post_text=$(echo $post_text | sed 's|^post_text ||')
>>>>
>>>> new_post_text=$(echo $post_text | sed
>>>> "s|\[quote:3pjjad9s\]$post_username,\([0-9/]*\),
>>>> \([0-9:]*\)\]<br>||I")
>>>> # echo $new_post_text
>>>> mysql --database="$MYDB" --user="$USER" --password="$PASSWD" -e
>>>> "UPDATE phpbb_posts SET post_text = \"$new_post_text\" WHERE post_id =
>>>> \"$post_id\""
>>>>
>>>> let post_id=post_id-1
>>>> done
>>>> --------------------------------------------
>>>>
>>>> ...che ne dite?
>>>> MaX
>>>>
>>>> Il 13/02/15, MaX<maxlinux2000@gmail.com> ha scritto:
>>>>> ciao a tutti
>>>>>
>>>>> avrei un problema con le espessioni regolari dentro ad una query mysql
>>>>> inglobata a sua volta in uno script :)
>>>>>
>>>>> chpass() {
>>>>> mysql --database="$MYDB" --user="$USER" --password="$PASSWD" -e
>>>>> "UPDATE phpbb_users
>>>>> SET user_password = \"$HPPASS\" WHERE username = \"$PHPBB_USER\""
>>>>> }
>>>>>
>>>>> questo sopra 癡 un esempio che uso per modificare via script la passwd
>>>>> di un utente in phpbb.
>>>>>
>>>>> Ora per籀 vorrei cancellare una parte di testo dal campo "
>>>>> phpbb_posts/post_text" ma solo se dentro a questo testo appare:
>>>>> [quote]nome utente,20/7/2012, 19:54] e il nome utente coicide con il
>>>>> relativo campo " phpbb_posts/post_username"
>>>>>
>>>>> Praticamente c' 癡 da cancellare la linea "[quote]Alfredo,20/7/2012,
>>>>> 19:54]" solo se nel campo "post_username" il nome coincide con
>>>>> "Alfredo".
>>>>>
>>>>> A complicare le cose... la data di fianco 癡 variabile, e il
>>>>> "[quote]Alfredo,20/7/2012, 19:54]"
>>>>> 癡 sempre nella seconda linea
>>>>>
>>>>> Come se non bastasse, se nel messsaggio compare un
>>>>> "[quote]Alfredo,20/7/2012, 19:54]", ma nel "post_username" il nome 癡
>>>>> differente da "Alfredo", allora bisogna lasciarlo.
>>>>>
>>>>> ..e naturalmente il resto del messaggio deve rimanere inalterato.
>>>>>
>>>>> qualche idea?
>>>>>
>>>>> io stavo pensando di estrarre il post_id,post_text,post_text con una
>>>>> query, fare le comparazioni con gli strumenti della shell linux,
>>>>> togliere eventualemente il testo e poi reimmettere il testo modificato
>>>>> usando come riferimento il post_id
>>>>>
>>>>> o ci sono soluzioni migliori... e pi羅 rapide... interne a mysql?
>>>>>
>>>>> ciao
>>>>> MaX
>>>>
>>>>
>>>> --
>>>> ciao,
>>>> MaX
>>>
>>>
>>> --
>>> ciao,
>>> MaX
>>
>>
>> --
>> ciao,
>> MaX
>
>
> --
> ciao,
> MaX
>
>
> --
> Per REVOCARE l'iscrizione alla lista, inviare un email a
> debian-italian-REQUEST@lists.debian.org con oggetto "unsubscribe". Per
> problemi inviare un email in INGLESE a listmaster@lists.debian.org
>
> To UNSUBSCRIBE, email to debian-italian-REQUEST@lists.debian.org
> with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
> Archive: https://lists.debian.org/CAEyAVmth-AV+O9x0eBdZzRqv0ekuohx4S6rwsdfeyTAupg@mail.gmail.com
>
>
Reply to: