Script bash para contar repeticiones de urls en un access log de apache y otro de insertar en base de datos de regalo
Hace poco he tenido que procesar unos cuantos ficheros que sumagan unos cuentos cientos de gigas.
Basicamente tenía que procesar los access logs de apache para encontrar un determinado tipo de urls las amigables que iban al SRP y las del SRP no amigables que venían del formulario de búsqueda.
Proceso fichero por fichero con un loop sobre un ls, aplico un grep a cada fichero para sacar los 200, un cut para coger la url de cada linea del log, un sort, un uniq con -c para contar, vuelvo a ordenar, hago un grep para quedarme en este caso solo con las urls que contienen una determinada palabra, la expresión regular se puede complicar o con u -Ev en el grep, definir expresiones regulares complejas y excluirlas, luego hago un sed para hacer un trim y cambiar un espacio por un punto y coma y finalmente creo un fichero sql con una insercción por linea
for fichero in $(ls web*)
do
echo $fichero;
fout=$fichero".sql";
grep "200 " $fichero \
| cut -d ' ' -f 7 \
| sort \
| uniq -c \
| sort -rn \
| grep "index.php/cod.search" \
| sed -e 's/^ *//' -e 's/ *$//' -e 's/\s/;/g' \
| awk -F';' '{print "INSERT INTO tmp_log_apache VALUES (\""$2"\","$1") ON DUPLICATE KEY UPDATE pageviews=pageviews+"$1";";}' > logsfinalindex/$fout
done
Al final lo he tenido que meter en mysql por que si intentaba hacer todo de golpe con algo como esto
cat web* \
| grep "200 " \
| cut -d ' ' -f 7 \
| sort \
| uniq -c \
| sort -rn \
| grep "index.php/cod.search" \
| sed -e 's/^ *//' -e 's/ *$//' -e 's/\s/;/g' \
| awk -F';' '{print "INSERT INTO tmp_log_apache VALUES '"$2"',"$1" ON DUPLICATE KEY set count=count+"$1";";}' > accesslog-friendly-srp-urls.sql
Se quedaban los servidores sin memoria suficiente en el /tmp para hacer la operación, una pena :(
Os pongo otro ejemplo con urls amigables, una expresión regular mas compleja
cat /home/niumba/logs/web* \
| grep "200 " \
| cut -d ' ' -f 7 \
| sort \
| uniq -c \
| sort -rn \
| grep -Ev "\*|/[0-9]+$|ico|txt|\?|php|images|templates|content|rentals|que-hacer|/accomodation-swimming-pool|/Alojamientos-Mobile-World-Congress|/apartamentos-lujo|/attractions_guide/oxfor|/burriana|/cala-cerrada|/carnaval|/casas-rurales-asturias|/casas-rurales-baratas|/casas-rurales-cantabria|/casas-rurales-cataluna|/casas-rurales-con-piscina|/casas-rurales-galicia|/casas-rurales-granada|/casas-rurales-madrid|/casas-rurales-malaga|/casas-rurales-navarra|/cheap-holidays|/ciudad|/dog-holidays|/ecoturismo-espana|/en|/europa|/europa|/europa|/europe|/la-baeza|/las-mejores-playas|/leurope|/luanco|/mijas|/pirineo|/pirineo-catalan|/piscinas|/playa-de-la-concha|/playa-jandia|/playa-rodas|/playa-tamarit|/rosas/apartamentos|/semana-santa|/things-to-do-in|/vacaciones-baratas|/vacaciones-baratas|/vacaciones-baratas|/vacaciones-ninos|/vacaciones-perro|/vacaciones-perro|/vacaciones-perro|/villajoyosa|gijon|sssssssssssssssss/Alojamientos-Mobile-World-Congress|/cala-son-real|/casas-rurales-albacete|/casas-rurales-alicante|/casas-rurales-andalucia|/casas-rurales-avila|/casas-rurales-burgos|/casas-rurales-caceres|/casas-rurales-cadiz|/casas-rurales-canarias|/casas-rurales-cazorla|/casas-rurales-cuenca|/casas-rurales-economicas|/casas-rurales-en-la-sierra|/casas-rurales-encanto|/casas-rurales-huelva|/casas-rurales-huesca|/casas-rurales-la-rioja|/casas-rurales-leon|/casas-rurales-murcia|/casas-rurales-para-2|/casas-rurales-playa|/casas-rurales-salamanca|/casas-rurales-segovia|/casas-rurales-soria|/casas-rurales-tenerife|/casas-rurales-teruel|/casas-rurales-valencia|/cheap-accommodation-benidorm|/cheap-accommodation-madrid|/cheap-apartments-barcelona|/cheap-holidays-spain|/cheap-villas-Ibiza|/family-villas-spain|/luxury-villas-spain|/playa-blanca|/playa-de-cala-son-real|/playa-de-gandia|/playa-del-ingles|/playa-maspalomas|/playa-san-juan|/spanish-costas|/villas-mallorca|/villas-tenerife/attractions_guide/oxford|/attractions_guide/southam|/el-bosque-encantado|/puente-de-mayo|/Santiago-de-Compostela/Catedral-de-santiago-de-compostela|/Santiago-de-Compostela/Convento-de-San-Francisco|/Santiago-de-Compostela/Monte-do-gozo|/Santiago-de-Compostela/Museo-do-pobo-galego|/Santiago-de-Compostela/Plaza-del-Obradoiro|/Santiago-de-Compostela/Portico-de-la-gloria|/things-to-do-in/glasgow|/things-to-do-in/london|/things-to-do-in/london|/things-to-do-in/london/big-ben|/things-to-do-in/london/big-ben|/things-to-do-in/manchester|/Toledo/monasterio-de-san-juan-de-los-reyes|/Toledo/museo-del-greco|/Toledo/santa-maria-la-blanca|/Toledo/sinagoga-del-transito|/vacaciones-terra-natura|/Valladolid/auditorio-miguel-delibes|/Valladolid/catedral-de-valladolid|/Valladolid/estadio-jose-zorrilla|/Valladolid/museo-nacional-de-escultura" \
| sed -e 's/^ *//' -e 's/ *$//' -e 's/\s/;/g' \
| awk -F';' '{print $2";"$1;}' > accesslog-friendly-srp-urls.csv
Y este ultimo que aunque no lo he usado esta muy bien y quiero que lo veais, para que se os ocurran buenas ideas
#!/bin/bash
for i in $( cat ruta );
do
mysql --host=xxx.xxx.xxx.xxx --user=usuarios --password=contraseña base-de-datos << EOF
INSERT INTO tmp_log_apache (url) values ('$i');
EOF
done
Ala a disfrutar!
Basicamente tenía que procesar los access logs de apache para encontrar un determinado tipo de urls las amigables que iban al SRP y las del SRP no amigables que venían del formulario de búsqueda.
Proceso fichero por fichero con un loop sobre un ls, aplico un grep a cada fichero para sacar los 200, un cut para coger la url de cada linea del log, un sort, un uniq con -c para contar, vuelvo a ordenar, hago un grep para quedarme en este caso solo con las urls que contienen una determinada palabra, la expresión regular se puede complicar o con u -Ev en el grep, definir expresiones regulares complejas y excluirlas, luego hago un sed para hacer un trim y cambiar un espacio por un punto y coma y finalmente creo un fichero sql con una insercción por linea
for fichero in $(ls web*)
do
echo $fichero;
fout=$fichero".sql";
grep "200 " $fichero \
| cut -d ' ' -f 7 \
| sort \
| uniq -c \
| sort -rn \
| grep "index.php/cod.search" \
| sed -e 's/^ *//' -e 's/ *$//' -e 's/\s/;/g' \
| awk -F';' '{print "INSERT INTO tmp_log_apache VALUES (\""$2"\","$1") ON DUPLICATE KEY UPDATE pageviews=pageviews+"$1";";}' > logsfinalindex/$fout
done
Al final lo he tenido que meter en mysql por que si intentaba hacer todo de golpe con algo como esto
cat web* \
| grep "200 " \
| cut -d ' ' -f 7 \
| sort \
| uniq -c \
| sort -rn \
| grep "index.php/cod.search" \
| sed -e 's/^ *//' -e 's/ *$//' -e 's/\s/;/g' \
| awk -F';' '{print "INSERT INTO tmp_log_apache VALUES '"$2"',"$1" ON DUPLICATE KEY set count=count+"$1";";}' > accesslog-friendly-srp-urls.sql
Se quedaban los servidores sin memoria suficiente en el /tmp para hacer la operación, una pena :(
Os pongo otro ejemplo con urls amigables, una expresión regular mas compleja
cat /home/niumba/logs/web* \
| grep "200 " \
| cut -d ' ' -f 7 \
| sort \
| uniq -c \
| sort -rn \
| grep -Ev "\*|/[0-9]+$|ico|txt|\?|php|images|templates|content|rentals|que-hacer|/accomodation-swimming-pool|/Alojamientos-Mobile-World-Congress|/apartamentos-lujo|/attractions_guide/oxfor|/burriana|/cala-cerrada|/carnaval|/casas-rurales-asturias|/casas-rurales-baratas|/casas-rurales-cantabria|/casas-rurales-cataluna|/casas-rurales-con-piscina|/casas-rurales-galicia|/casas-rurales-granada|/casas-rurales-madrid|/casas-rurales-malaga|/casas-rurales-navarra|/cheap-holidays|/ciudad|/dog-holidays|/ecoturismo-espana|/en|/europa|/europa|/europa|/europe|/la-baeza|/las-mejores-playas|/leurope|/luanco|/mijas|/pirineo|/pirineo-catalan|/piscinas|/playa-de-la-concha|/playa-jandia|/playa-rodas|/playa-tamarit|/rosas/apartamentos|/semana-santa|/things-to-do-in|/vacaciones-baratas|/vacaciones-baratas|/vacaciones-baratas|/vacaciones-ninos|/vacaciones-perro|/vacaciones-perro|/vacaciones-perro|/villajoyosa|gijon|sssssssssssssssss/Alojamientos-Mobile-World-Congress|/cala-son-real|/casas-rurales-albacete|/casas-rurales-alicante|/casas-rurales-andalucia|/casas-rurales-avila|/casas-rurales-burgos|/casas-rurales-caceres|/casas-rurales-cadiz|/casas-rurales-canarias|/casas-rurales-cazorla|/casas-rurales-cuenca|/casas-rurales-economicas|/casas-rurales-en-la-sierra|/casas-rurales-encanto|/casas-rurales-huelva|/casas-rurales-huesca|/casas-rurales-la-rioja|/casas-rurales-leon|/casas-rurales-murcia|/casas-rurales-para-2|/casas-rurales-playa|/casas-rurales-salamanca|/casas-rurales-segovia|/casas-rurales-soria|/casas-rurales-tenerife|/casas-rurales-teruel|/casas-rurales-valencia|/cheap-accommodation-benidorm|/cheap-accommodation-madrid|/cheap-apartments-barcelona|/cheap-holidays-spain|/cheap-villas-Ibiza|/family-villas-spain|/luxury-villas-spain|/playa-blanca|/playa-de-cala-son-real|/playa-de-gandia|/playa-del-ingles|/playa-maspalomas|/playa-san-juan|/spanish-costas|/villas-mallorca|/villas-tenerife/attractions_guide/oxford|/attractions_guide/southam|/el-bosque-encantado|/puente-de-mayo|/Santiago-de-Compostela/Catedral-de-santiago-de-compostela|/Santiago-de-Compostela/Convento-de-San-Francisco|/Santiago-de-Compostela/Monte-do-gozo|/Santiago-de-Compostela/Museo-do-pobo-galego|/Santiago-de-Compostela/Plaza-del-Obradoiro|/Santiago-de-Compostela/Portico-de-la-gloria|/things-to-do-in/glasgow|/things-to-do-in/london|/things-to-do-in/london|/things-to-do-in/london/big-ben|/things-to-do-in/london/big-ben|/things-to-do-in/manchester|/Toledo/monasterio-de-san-juan-de-los-reyes|/Toledo/museo-del-greco|/Toledo/santa-maria-la-blanca|/Toledo/sinagoga-del-transito|/vacaciones-terra-natura|/Valladolid/auditorio-miguel-delibes|/Valladolid/catedral-de-valladolid|/Valladolid/estadio-jose-zorrilla|/Valladolid/museo-nacional-de-escultura" \
| sed -e 's/^ *//' -e 's/ *$//' -e 's/\s/;/g' \
| awk -F';' '{print $2";"$1;}' > accesslog-friendly-srp-urls.csv
Y este ultimo que aunque no lo he usado esta muy bien y quiero que lo veais, para que se os ocurran buenas ideas
#!/bin/bash
for i in $( cat ruta );
do
mysql --host=xxx.xxx.xxx.xxx --user=usuarios --password=contraseña base-de-datos << EOF
INSERT INTO tmp_log_apache (url) values ('$i');
EOF
done
Ala a disfrutar!
Luego te quejas de mis querys
ResponderEliminar