Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Sistemas operativos > Linux
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-09-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.093
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Con la siguiente instrucción podemos ver los 10 comandos más utilizados y cuantas veces lo hemos usado.

Cita:
antonio@linox:~$ history|awk '{print $2}'|awk 'BEGIN {FS="|"} {print $1}'|sort|uniq -c|sort -rn|head -10
137 sudo
88 ll
59 cd
28 locate
21 top
18 sh
17 exit
16 wget
16 more
12 gedit
antonio@linox:~$
La verdad es que muy intuitivo no es.
Responder Con Cita
  #2  
Antiguo 11-09-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Ciertamente puede usarse python, pero los administradores de servidores normalmente usarán directamente los comandos o scripts del shell. Python o Perl son para tareas más complejas.

// Saludos
Responder Con Cita
  #3  
Antiguo 11-09-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 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
  #4  
Antiguo 11-09-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.093
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular


Sí, "más o menos" lo sabía, aunque no tan detalladamente. ¿Lo conoces tan bien como para no tener que consultar lo que hace cada comando?
Responder Con Cita
  #5  
Antiguo 11-09-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Ja, ja, no

Cuando digo que con la práctica se vuelve intuitivo no me refiero a mi sino a gente que he visto trabajar así. Pero el desglose (ese sí es mío) deja ver que en efecto es así.

Por otra parte, aunque un administrador, muchos comandos los sabe al derecho y alrevés, es lógico que no está excento de consultar la referencia. Lo mismo nosotros con delphi, la ayuda no la echamos al cajón del olvido

// Saludos
Responder Con Cita
  #6  
Antiguo 11-09-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Lo que si es un misterio para mi, es ¿para qué quiero saber los diez comandos que más uso?

// Saludos
Responder Con Cita
  #7  
Antiguo 11-09-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.093
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Muy importante no es
Responder Con Cita
  #8  
Antiguo 11-09-2012
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.918
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
A modo comparativo, lo mismo, con python

NOTA: Para hacer llamadas a lineas de comandos, se usa subprocess, o os.popen, pero dio la casualidad que "history" es un comando desactivado sino se esta en modo interactivo, osea, es dificil de hacerle programacion. Normalmente uno haria:

Código PHP:
import os

resultado
=os.popen("ls").read()

print 
resultado 
Pero "history" es un maldito que no se deja asi. Una fregada del bash.

Asi que uno puede hacer:

Código PHP:
history resultado.txt 
Para tener el resultado en un archivo de texto. Desde ahi, entrar a python y:

1. Cargar el archivo, separado por lineas, en una estructura de lista:

Código PHP:
lineas open('resultado.txt').readlines() 
Una lista se lee asi:

http://effbot.org/zone/python-list.htm

2. Ahora le mochamos los numeros y dejamos los comandos. La solucion "simple" es partir cada linea y construir otra lista

Le hago trim a cada linea, parto con split (por defecto parte por 1 espacio), y cojo el segundo resultado (split devuelve otra lista asi: ['1','comando'])

Código PHP:
comandos = [linea.strip().split()[1] for linea in lineas
Código:
> print comandos[:5]
>>> ['ls', 'chflags', 'ls', 'python', 'easy_install']
3. Ahora viene la parte de "conocer realmente python" o tambien llamada " usar google". Como se cuantas veces cada item de la lista se repite? El algoritmo es facil de armar, pero la idea que llevo es hacer lo mismo, con comandos de pocas lineas. Pero con python, las baterias estan incluidas!:

collections.Counter me devuelve un diccionario, con llave= comando, valor = cuantas veces se repite

Código PHP:
import collections

rank
=collections.Counter(comandos
Y ahora como ordenarlo. Otro algoritmo facil a punta de ciclos FOR, pero que carajos, python tiene baterias incluidas, asi que googleando:

Código PHP:
from operator import itemgetter

ordenado 
sorted(rank.items(), key=itemgetter(1)) 
Esto me ordena usando una funcion de ordenacion, enviada como parametro de comparacion (un truco de programacion funcional, creo que ya es mas conocido). Esto me ordena de menor a mayor. Como obtengo los mas usados? Lo puede reversar, y sacar los primeros (tail)

Código PHP:
ordenado.reverse()

print 
ordenado[:10]
>> [(
'hg'988),
 (
'cd'709),
 (
'sudo'648),
 (
'st'430),
 (
'ls'354),
 (
'ci'275),
 (
'python'223),
 (
'push'212),
 (
'clear;'188),
 (
'heroku'182)] 

Lo que me gusta de hacerlo con python, a pesar de que igual hay que aprender del lenguaje y las librerias (y que ciertas cosas obviamente sale mejor o mas rapido directamente por comandos establecidos) es que puedo interactuar con los datos. En cualquier momento, doy un print, saco los 10 primeros de la lista, le hago un for, etc... es mucho mas practico en muchos casos.

La otra razon, es que python se puede resumir en: Maneja lista, maneja diccionario. Practicamente todo devuelve listas y diccionarios. Es mucho mas intuitivo que operar siempre con cadenas y switches, y mas facil de operar. Es algo que se vuelve obvio cuando se entra a linea de comandos interactivo de python y se hacen las llamadas a las funciones: listas, diccionarios, todo el tiempo. Es muy practico!
__________________
El malabarista.
Responder Con Cita
  #9  
Antiguo 11-09-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.093
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Está muy bien, aunque hay que tener python, crear el programita, etc.
No le quito el mérito, pero la "gracia" de la línea de comando unix/linux es esa, que de "un tirón", interactivamente, puedes hacerlo.
Responder Con Cita
  #10  
Antiguo 12-09-2012
Avatar de D-MO
D-MO D-MO is offline
Miembro
 
Registrado: ago 2005
Ubicación: root@debian:/#
Posts: 1.042
Poder: 20
D-MO Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
...aunque hay que tener python...
Python viene de paquete en cada distro Unix/Linux .

Cita:
Empezado por Casimiro Notevi Ver Mensaje
...de "un tirón"...
¿Y si mezclamos python + shell?

Tomando como base el código de mamcx:
Código:
history|python -c 'import sys; print [linea.strip().split()[1] for linea in sys.stdin.readlines()][-10:]'
No es lo ideal, por supuesto. Pero la cosa aquí es si se puede o no.
Responder Con Cita
  #11  
Antiguo 12-09-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.093
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por D-MO Ver Mensaje
Pero la cosa aquí es si se puede o no.
Entonces, se puede, se puede...
Responder Con Cita
  #12  
Antiguo 12-09-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por D-MO Ver Mensaje
Tomando como base el código de mamcx:
Código:
history|python -c 'import sys; print [linea.strip().split()[1] for linea in sys.stdin.readlines()][-10:]'
No es lo ideal, por supuesto. Pero la cosa aquí es si se puede o no.
Últimamente nos andan queriendo meter gol

No digo que no me guste, porque sí me gusta, pero esto que pones DM-O y que se ve tan sencillito, no es lo mismo que describe mamcx. Esto muestra los últimos 10 comandos, no los 10 más usados.

Aparte de este "detalle", en ocasiones el history tiene líneas en blanco (salvo por el número), no sé muy bien porqué, pero eso da al traste con el algoritmo. En python, ¿cómo puedo eliminar las líneas en blanco?

// Saludos
Responder Con Cita
  #13  
Antiguo 12-09-2012
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.918
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por roman Ver Mensaje
No digo que no me guste, porque sí me gusta, pero esto que pones DM-O y que se ve tan sencillito, no es lo mismo que describe mamcx. Esto muestra los últimos 10 comandos, no los 10 más usados.
Me parecio que la idea que dio DM-O es combinar python/bash. Osea, es una forma de simplificar conceptualmente lo que hicieron con muchos otros comandos -que como en mi caso, desconocia- y terminar el trabajo con bash.

Cita:
Empezado por roman Ver Mensaje
Aparte de este "detalle", en ocasiones el history tiene líneas en blanco (salvo por el número), no sé muy bien porqué, pero eso da al traste con el algoritmo. En python, ¿cómo puedo eliminar las líneas en blanco?
Código PHP:
a=['1 ','  ','2']

print [
x.strip() for x in a if x.strip() != ''

>>[
'1''2'
__________________
El malabarista.
Responder Con Cita
  #14  
Antiguo 11-09-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Sí, realmente se ve bien. Yo creo que cada uno tiene su ámbito. El uso de comandos del shell es más para administradores en sus tareas del día a día en que no van a hacer un script por cada tarea que requieran al momento. La solución que describes es más agradable para nosotros los programadores

// Saludos
Responder Con Cita
  #15  
Antiguo 11-09-2012
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.918
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Claro, como programador me gusta mas. Ademas, es aprender un solo ambiente (python) que ademas me sirve para otras cosas, vs varios (bash, windows) que solo sirve pa administrar....

Y no hay que crear el programa, todo se puede desde la linea interactiva...
__________________
El malabarista.
Responder Con Cita
  #16  
Antiguo 12-09-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.093
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por mamcx Ver Mensaje
Y no hay que crear el programa, todo se puede desde la linea interactiva...
¿Pero comando a comando o todos juntos del tirón?
Responder Con Cita
  #17  
Antiguo 12-09-2012
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.918
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿Pero comando a comando o todos juntos del tirón?
Comando a comando. Simplemente escribes python en la terminal y entras a python. Vas escribiendo lo que necesitas.
__________________
El malabarista.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Comandos en Terminal Server Draker Varios 4 16-10-2008 19:35:10
Mezclar Php y JavaScript lucasarts_18 PHP 9 13-03-2007 21:38:10
Mezclar Delphi5 y Visual Basic 6.0 guiweb Varios 4 23-11-2006 14:50:36
es posible mezclar colores a los tform ronimaxh Varios 5 01-02-2006 19:36:14
Mezclar videos walito Varios 2 21-01-2006 01:21:38


La franja horaria es GMT +2. Ahora son las 09:24:52.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi