Problema 1: Tenemos que volver a usar algún comando o fichero pero no conseguimos recordarlo

Solución 1: Pulsar en para mirar en el histórico de comandos usados

Problema 2: Es un rollo y hay mucha morralla

Solución 2: Hacer un script que analice el histórico y nos saque la información más relevante

1- Configurar histórico (~/.bashrc)

...
#No guardar en el histórico duplicados consecutivos
HISTCONTROL=ignoredups
#No guardar en el histórico comandos sencillos de uso habitual
HISTIGNORE="pwd:ls:ls -lah:date:cd"
...

2- Crear script (/usr/local/bin/uso)

#!/usr/bin/perl -w
use Cwd 'abs_path';

my ($hst,$tp,$icm,$filter)=(undef,-1,0,0);
while(@ARGV) {
    $_=shift(@ARGV);
    if ($_ =~ /\d+/) {
        $tp=$_;
    } elsif ($_ eq "-c") {
        $icm=1;
    } elsif (-f $_) {
        $hst=$_;
    } else {
        $filter=$_;
    }
}
if ($tp==-1) {$tp=($filter?5:10);}
if (!$hst) {
    $hst="$ENV{HOME}/.bash_history";
}
my $home= abs_path($hst);
$home =~ s/\/[^\/]+$/\//;

sub report_top {
    my( $top_count, %hash ) = @_;
    my @top_commands  = sort { $hash{$b} <=> $hash{$a} } keys %hash;
    my $max_width = length $hash{$top_commands[0]};
    while( my( $i, $value ) = each @top_commands ) {
        last if $i >= $top_count && $top_count>0;
        #printf '%*d %s' . "\n", $max_width, $hash{$top_commands[$i]}, $top_commands[$i];
        print $top_commands[$i] . "\n";
    }
}
sub gFile {
    my $r=shift;
    if (-f $r) {
        return abs_path($r);
    } 
    my $p=index($r,"/");
    if ($p==0) {
        return $r;
    }
    if (-f ($home . $r)) {
        return abs_path(($home . $r));
    }
    if ($p>0) {
        $r=`sudo test -e $r && sudo readlink -f $r || echo 0`;
        chomp($r);
        return $r;
    }
    return undef;
}

open (HISTORY, "<", $hst)  or die "Cannot open $hst: $!";

my $b;
my $cmd;
my @fls;
my %files;
my %cmds;
while ($cmd=<HISTORY>) {
    chomp($cmd);
    $cmd =~ s/  +/ /g;
    $cmd =~ s/(^ +| +$)//g;
    $cmd =~ s/^sudo +//;
    next if length($cmd)<5 || index($cmd," ")<1 || $cmd =~ /(whereis|kill|cd|ls|su|uso) / || ($filter && index($cmd,$filter)==-1);
    $b=($cmd =~ /^(nano|tail|head|cat) /);
    if (!$icm && $b) {
        @fls=split(/ /,$cmd);
        shift(@fls);
        foreach my $fl (@fls) {
            if (index($fl,"/")==0 && $files{$fl}) {$files{$fl}++}
            elsif (($fl=gFile($fl)) && index($fl,$home)!=0) {$files{$fl}++;}
        }
        next;
    }
    if ($icm && !$b) {
        $cmds{$cmd}++;
    }
}
close(HISTORY);

if (keys(%files)) {report_top($tp,%files);}
if (keys(%cmds)) {report_top($tp,%cmds);}

3- Parámetros

  • por defecto muestra los ficheros más usados
  • con -c muestra los comando más usados
  • parsea el fichero que se le pase, y por defecto el .bash_history del usuario que ejecuta el script
  • si se le pasa una palabra sera usada para filtrar los resultados
  • si se le pasa un número se usara como tope máximo de resultados a mostrar (siendo 0 = todos)
  • por defecto se mostraran 5 elementos si se esta filtrando y 10 en caso contrario

4- Ejemplos de uso (nunca mejor dicho, jeje)

pi@bot ~ $ uso
/var/log/prosody/prosody.log
/usr/local/bin/hf
/usr/local/bin/cmd
/var/log/prosody/prosody.err
/usr/lib/prosody/modules/mod_takenote.lua
/usr/local/bin/atajo
/usr/bin/prosody
/home/bot/HAL/riddim/plugins/hashtag.lua
/root/.centerim/config
/etc/hosts
pi@bot ~ $ uso -c
/etc/init.d/prosody restart
history | hf
atajo prosody
atajo note
cmd a
chmod +x /usr/local/bin/hf
/bin/bash -i -c history
/usr/local/bin/dwn
lua HAL/riddim/init.lua
hg clone http://code.matthewwild.co.uk/verse/ verse
pi@bot ~ $ uso 2
/var/log/prosody/prosody.log
/usr/local/bin/hf
pi@bot ~ $ uso prosody
/var/log/prosody/prosody.log
/var/log/prosody/prosody.err
/usr/lib/prosody/modules/mod_takenote.lua
/usr/bin/prosody
/var/log/prosody/prosody.not
pi@bot ~ $ sudo uso /home/bot/.bash_history -c lua 1
lua riddim/init.lua

4- Apéndice

.bash_history no se actualiza en tiempo real así que si necesitamos que nuestro script analice hasta el últimisimo comando ejecutado debemos forzar antes una actualización mediante el comando:

pi@bot ~ $ history -a

No integramos la llamada a "history -a" dentro de nuestro script porque necesita ser ejecutado directamente por el usuario para garantizar que se actualice su .bash_history

Fuente: www.learning-perl.com