Ver Mensaje Individual
  #12  
Antiguo 11-09-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Casimiro Notevi Ver Mensaje
La verdad es que muy intuitivo no es.
Bueno, aquí estás usando el lenguaje AWK incrustado en el comando y ciertamente AWK es todo menos intuitivo. De todas formas, con práctica, el uso de comandos se torna intuitivo.

Veamos cómo obtener los diez comandos más usados:

1. El comando history nos da los últimos comandos ejecutados. La salida de history se ve similar a esto:

Código:
  460  find .
  461  find . -exec rm
  462  find . -exec rm {}
  463  find . -exec rm {} \;
  464  find *.sql -exec rm {} \;
  465  ls
  466  cd ..
  467  cp *sql foo/
  468  ls
  469  cp foo.bmp foo/
  470  cd foo
  471  ls
  472  find *.sql -exec rm {} \;
Cada comando precedido por un número y hay varios espacios separando los números de los comandos.

2. Lo primero es tener delimitadores bien definidos. Para ello podemos comprimir los espacios separadores en uno sólo con el comando tr (transalate) aplicado a la salida de history:

Código:
history|tr -s ' '
La opción s es de squeeze. La salida se ve similar pero ya sólo hay un espacio separando los términos:

Código:
460 find .
 461 find . -exec rm
 462 find . -exec rm {}
 463 find . -exec rm {} \;
 464 find *.sql -exec rm {} \;
 465 ls
 466 cd ..
 467 cp *sql foo/
 468 ls
 469 cp foo.bmp foo/
 470 cd foo
 471 ls
 472 find *.sql -exec rm {} \;
 473 ls
 474 touch asql
 475 ls
 476 find *.sql -exec rm {} \;
 477 rm .
 478 ls
 479 rm *
 480 ls
 481 cd ..
 482 find *.sql -exec cp {} foo\ \;
 483 find *.sql -exec cp {} foo \;
 484 cd foo
3. El comando cut sirve para tomar partes de una cadena, pueden ser letras o columnas delimitadas. En este caso, nuestras columnas están delimitadas por un espacio y nos interesa la tercera (hay un espacio al principio):

Código:
history|tr -s ' '|cut -d ' ' -f3
-d indica el delimitador que por defecto es el tabulador y -f el número de columna deseada. La salida queda así:

Código:
find
find
find
find
find
ls
cd
cp
ls
cp
cd
ls
find
ls
touch
ls
find
rm
ls
rm
ls
cd
find
find
cd
Ya tenemos aislados los comandos.

4. O casi, porque podríamos tener concatenaciones anteriores:

Código:
ls|grep sql
Si sólo nos interesa el comando base tendremos que repetir el comando cut ahora con el pipe de separador:

Código:
history|tr -s ' '|cut -d ' ' -f3|cut -d '|' -f1
5. El comando uniq sirve para trabajar líneas repetidas y su opción -c las cuenta. Pero como sólo cuenta líneas repetidas adyacentes, primero hay que ordenarlas con el comando sort:

Código:
history|tr -s ' '|cut -d ' ' -f3|cut -d '|' -f1|sort|uniq -c
uniq antepone el número de ocurrencias:

Código:
      4 cd
      2 cp
      9 find
      7 ls
      2 rm
      1 touch
6. Ahora usamos sort nuevamente para ordenarlas por número de ocurrencias pues es la primera columna de la salida:

Código:
history|tr -s ' '|cut -d ' ' -f3|cut -d '|' -f1|sort|uniq -c|sort
7. Finalmente, tomamos las últimas (tail) 10:

Código:
history|tr -s ' '|cut -d ' ' -f3|cut -d '|' -f1|sort|uniq -c|sort|tail -10
8. Como detalle, podemos eliminar el mismo comando history del listado usando grep antes de contar:

history|tr -s ' '|cut -d ' ' -f3|cut -d '|' -f1|grep -v history|sort|uniq -c|sort|tail -10



Como se ve, cada comando se aplica naturalmente. Con práctica se vuelve intuitivo y muy potente para, por ejemplo, revisar bitácoras.

// Saludos
Responder Con Cita