From marcelo.magallon en gmail.com Fri Jul 6 04:44:56 2012 From: marcelo.magallon en gmail.com (Marcelo) Date: Fri, 6 Jul 2012 05:44:56 -0600 Subject: Aprendiendo Perl, el reto: historia popular Message-ID: Hola, brian volvió a publicar un reto en la serie. Todavía tengo pendiente una traducción de la respuesta del anterior, que resultó un poco larga. El original en Inglés está en http://www.learning-perl.com/?p=302 ------------------------- 8< ------------------------- Para el reto de junio, escriba un programa que lea la historia de comandos del shell y determine cuales son los que usted utiliza con más frecuencia. En bash, es posible asignar valores a HISTFILE y HISTFILESIZE para controlar el comportamiento de la historia. Para obtener los comandos a contar, puede leer el archivo correcto o hacer una llamada al comando "history". A partir de ahí usted tiene que decidir como partir cada línea a fin de determinar cuál es el comando. ¿Puede soportar comandos con paths relativos y absolutos de manera que no los cuente de forma separada? Esto fue un meme hace un tiempo, y me gustaría encontrar mi respuesta de entonces. Si usted la encuentra por favor hágamelo saber. ------------------------- >8 ------------------------- Como siempre están invitados a poner sus respuestas en el artículo de brian o hacer sus preguntas y comentarios por acá. Saludos, Marcelo From javier.tia en gmail.com Sun Jul 8 17:28:46 2012 From: javier.tia en gmail.com (=?UTF-8?Q?Javier_Ti=C3=A1?=) Date: Sun, 8 Jul 2012 18:28:46 -0600 Subject: Aprendiendo Perl, el reto: historia popular In-Reply-To: References: Message-ID: Hola, Mi respuesta a este reto: ------------------------- 8< ------------------------- #!/usr/bin/env perl use strict; use warnings; use File::Basename 'basename'; sub get_cmds_shell_history() { # Llama bash en modo interactivo para llamar el comando interno 'history' my $get_cmds = qq/$ENV{'SHELL'} -i -c "history -r; history"/ . q/ | awk '{for (i=2; i $cmds_grouped{$a} } keys %cmds_grouped; ------------------------- 8< ------------------------- Saludos, 2012/7/6 Marcelo : > Hola, > > brian volvió a publicar un reto en la serie. Todavía tengo pendiente > una traducción de la respuesta del anterior, que resultó un poco > larga. > > El original en Inglés está en http://www.learning-perl.com/?p=302 > > ------------------------- 8< ------------------------- > > Para el reto de junio, escriba un programa que lea la historia de > comandos del shell y determine cuales son los que usted utiliza con > más frecuencia. > > En bash, es posible asignar valores a HISTFILE y HISTFILESIZE para > controlar el comportamiento de la historia. Para obtener los comandos > a contar, puede leer el archivo correcto o hacer una llamada al > comando "history". A partir de ahí usted tiene que decidir como > partir cada línea a fin de determinar cuál es el comando. ¿Puede > soportar comandos con paths relativos y absolutos de manera que no los > cuente de forma separada? > > Esto fue un meme hace un tiempo, y me gustaría encontrar mi respuesta > de entonces. Si usted la encuentra por favor hágamelo saber. > > ------------------------- >8 ------------------------- > > Como siempre están invitados a poner sus respuestas en el artículo de > brian o hacer sus preguntas y comentarios por acá. > > Saludos, > > Marcelo > __ > Costarica-pm en pm.org > http://mail.pm.org/mailman/listinfo/costarica-pm -- Javier From marcelo.magallon en gmail.com Tue Jul 10 15:18:00 2012 From: marcelo.magallon en gmail.com (Marcelo) Date: Tue, 10 Jul 2012 16:18:00 -0600 Subject: Aprendiendo Perl, el reto: historia popular In-Reply-To: References: Message-ID: Hola, gracias por la contribución. No me aguanto las ganas de comentar sobre este pedazo en particular: 2012/7/8 Javier Tiá : > my $get_cmds = > qq/$ENV{'SHELL'} -i -c "history -r; history"/ > . q/ | awk '{for (i=2; i > chomp(my @cmds = qx# $get_cmds #); admito una reacción alérgica a la prescencia de awk ahí, pero en realidad no comento por eso, sino más bien porque la salida de "history" no es estable como para tratar de parsearla en esta forma. Por ejemplo, en mi caso una línea de esa salida se ve así: 2336 Tue, 10 Jul 2012 15:00:00 -0600 cd Uno podría tratar de poner parches encima a esto para asegurarse que la salida de "history" es exactamente lo que uno espera que sea, pero para este punto creo que es bueno cuestionarse si todo eso es realmente más sencillo que: open my $fh, "<", $histfile; while (<$fh>) { chomp; ... } y pasar la complejidad a asignarle un valor a $histfile (porque supongo que el problema que estás tratando de resolver es que $HISTFILE no es portable). Saludos, Marcelo From javier.tia en gmail.com Tue Jul 10 17:43:39 2012 From: javier.tia en gmail.com (=?UTF-8?Q?Javier_Ti=C3=A1?=) Date: Tue, 10 Jul 2012 18:43:39 -0600 Subject: Aprendiendo Perl, el reto: historia popular In-Reply-To: References: Message-ID: Hola Marcelo, 2012/7/10 Marcelo : > Hola, > > gracias por la contribución. > > No me aguanto las ganas de comentar sobre este pedazo en particular: > > 2012/7/8 Javier Tiá : > >> my $get_cmds = >> qq/$ENV{'SHELL'} -i -c "history -r; history"/ >> . q/ | awk '{for (i=2; i> >> chomp(my @cmds = qx# $get_cmds #); > > admito una reacción alérgica a la prescencia de awk ahí, pero en > realidad no comento por eso, sino más bien porque la salida de > "history" no es estable como para tratar de parsearla en esta forma. > Por ejemplo, en mi caso una línea de esa salida se ve así: > > 2336 Tue, 10 Jul 2012 15:00:00 -0600 cd Me alegra saques a relucir este pedazo de código. De todo el script, dicha parte fue la que más tiempo me tomó. Buscando respuesta a esta pregunta: ¿Cómo puedo leer la historia de una manera portable? ... En mi caso, también el formato de la historia es diferente: 2512 18:01 vim t Pero fue porque yo cambié el formato en mi '.bashrc', asumo que también cambiaste el suyo. Tampoco aplicaría mi solución, aunque solo tendría que cambiar 2 por 3 en el ciclo de awk. En tu caso por otro número "especial". Aplicaría para todo usuario que no haya tocado el formato de su historia, como viene por defecto en Bash, format de la historia: No cubre todos los casos, pero si la mayoría. Saludos, -- Javier