El comando dd permite, entre otras cosas, hacer copias de un fichero aplicando conversiones en el proceso. Dos conversiones sencillas que pueden llevarse a cabo con ficheros de texto son pasar todo a mayúsculas o a minúsculas.
Para ello,hay que teclear algo así
dd if=a.txt of=b.txt conv=ucase
Donde if significa "input file" y of significa "output file".
Si cambiamos "ucase" por "lcase" transformaremos todo el texto en minúsculas.
Atentos a los caracteres con tildes.
Mostrando entradas con la etiqueta unix. Mostrar todas las entradas
Mostrando entradas con la etiqueta unix. Mostrar todas las entradas
lunes, 22 de febrero de 2016
lunes, 5 de enero de 2015
Contar frecuencia de palabras en un texto con los filtros (comandos de consola) de Linux
Esta es una de esas necesidades recurrentes que aparecen cada poco tiempo. Y al final, siempre termino buscándolo en Internet, así que me he decidido a ponerlo aquí simplemente para tenerlo a mano.
El caso es que tengo un documento del que me gustaría sacar la estadística de palabras más utilizadas. O ya puestos, no limitarme a las más utilizadas, sino contar el número de veces que aparece cada palabra, para todas ellas.
Hay muchas soluciones para esto, podéis, por ejemplo, mirar aquí, en StackOverflow [1] varias formas de hacerlo.
La que a mí me ha parecido más sencilla, dentro de lo que yo necesitaba, y con alguna adaptación por mi parte (la opción -r en el sort) es esta:
Figura 1. Las 20 palabras más utilizadas en un texto
¿Y si quiero saber las menos utilizadas? Simplemente, miremos el final del fichero:
Figura 2. Las palabras menos utilizadas (una vez) están al final
Al mirar el fichero de resultados, me he dado cuenta de que me incluye los dígitos. Puede ser que alguien quiera contar el número de veces que se menciona un año, por poner un ejemplo en el que interese contar los números, pero no es mi caso, así que me gustaría descartar los dígitos.
Por otro lado, me gustaría también, una vez puesto, ignorar los signos de puntuación como el punto, la coma, el punto y coma, paréntesis, comillas dobles, etc... Solucionar esto es fácil.
Habréis visto que el espacio en blanco es el único separador de palabras que estoy utilizando, así que lo único que tengo que hacer es decirle al comando tr (translate, traducir unos caracteres en otros) que no sólo me "traduzca" los espacios en blanco a nueva línea, sino también todos los caracteres que quiero excluir. Algo así:
Figura 3. ¿Y si quitamos los dígitos y signos de puntuación?
Hmmm... vaya. En la primera línea vemos que aparece una "palabra" que es el espacio en blanco. Bueno, no era mi intención contarlo, pero esto tampoco es un problema, se puede ignorar. Por otro lado, vemos que la palabra "de" ahora se cuenta algunas veces más (ha pasado de 1709 a 1712 apariciones). Seguramente antes había algunas apariciones en la que estaba pegada a una coma o algún otro signo de puntuación. Lo mismo ocurre con "la", "que" y otras palabras. Parece que eso pinta bien.
Pero si vemos las últimas líneas, aún siguen apareciendo dígitos. ¿Qué ha pasado? Y, por cierto, el símbolo del % y el € y "las otras" comillas dobles también los quitaré en la próxima versión de mi script.
Lo que ocurre con los dígitos es que le he querido decir que traduzca cualquier cosa que esté en el intervalo 0..9 en un carácter de nueva línea. Y yo, ignorante, he pensado que el intervalo para definir un dígito se podía poner como para otros filtros de unix, como un rango. Pues resulta que no, para el filtro tr podemos usar ciertas categorías de caracteres especiales como :digit: :alpha: y otras (más info tecleando "man tr").
Así que la forma correcta de decírselo sería utilizar esta categoría o simplemente teclear directamente los diez dígitos en la orden:
Figura 4.Ahora sí
Como veréis, he introducido algunos caracteres especiales (como tres versiones para las comillas dobles, pues el texto provenía de un documento de Writer de LibreOffice y tenía comillas normales y tipográficas, que a su vez diferencian entre las de apertura y las de cierre), o los tres puntos suspensivos como un único carácter. Como estos caracteres no he sabido cómo ponerlos directamente con el teclado, he usado el copiar / pegar de la consola para conseguir introducirlos en la línea del script.
Por último, os pego aquí la línea final del script en modo texto para que podáis copiarla si os interesa:
cat texto.txt | tr ' .,;:0123456789()[]"“”%€…' '\n' | sort | uniq -c | sort -nr > resul.txt
Quedan un par de cosas pendientes, como las dichosas tildes, pero eso ya os lo dejo a vosotros, que no es cuestión de darlo todo masticado.
Creo que esto es un buen ejemplo de la potencia de los filtros en el mundo *NIX, y de cómo combinar herramientas pequeñas que hacen pequeñas tareas de forma muy eficiente, para conseguir resultados combinados verdaderamente potentes (¿alguien ha dicho sinergia?).
REFERENCIAS
[1] Contar palabras de diferentes maneras. http://stackoverflow.com/questions/10552803/how-to-create-a-frequency-list-of-every-word-in-a-file
viernes, 31 de octubre de 2014
Cómo saber cuánto tiempo lleva encendido el ordenador
A veces queremos saber cuánto tiempo lleva encendido un ordenador. ¿Cómo podemos hacer esto?
1. Respuesta corta
En Linux, MacOs, HP-UX y versiones varias de UNIX: comandos "w", "uptime" y "top"
En Windows: comando "systeminfo"
2. Respuesta larga
2.1 Aplicaciones
Simplemente, queremos saber cuánto lleva encendido el equipo. O bien, somos los responsables de un servidor, y queremos saber si el servidor se ha reiniciado por la noche, por ejemplo. O hemos llegado a casa y hemos pillado a nuestro hijo todo viciado matando orcos a diesto y siniesto. A pesar de que le dijimos que sólo podía jugar una hora al día, tiene los ojos inyectados en sangre, rojos como dos tomates, sospechamos algo y no nos creemos lo que nos jura y perjura de que acaba de encenderlo "hace ná". Queremos comprobar, en todos estos casos, cuánto tiempo lleva el ordenador encendido.
2.2 En Linux
Si el equipo está ejecutando un Linux, bastará con teclear bien poco, una sola letra y hecho. El comando "w" nos da la información que queremos en la primera línea de su salida. Como una imagen vale más que mil palabras, ahí va un ejemplo:
Tenemos más información adicional en ese comando, pero la que nos interesa está en la primera línea, junto con los datos de carga del procesador en el último minuto, últimos 5 y últimos 15 minutos. Si lo único que queremos es la información de esa primera línea sin mostrar la otra información (la de los usuarios que hay conectados), entonces podemos hacer un grep para solo mostrar la primera línea, así:
(ojo, esto podría sacar también otras líneas que contuvieran esa cadena de texto)
O bien, y mejor aún, ejecutar el comando "uptime", que muestra únicamente esa primera línea.
Otro comando que está en todos los *NIX modernos y que da esta misma info (más un montón de información adicional) es el comando top. Así, si ejecutamos
Obtendremos algo así
Aunque a decir verdad, a mí me gusta más la versión de "top con colorines", llamada "htop" (también existen "atop" y otros...)
2.3 En Windows
En todas las versiones de Windows desde XP tenemos el comando "systeminfo", que se encarga de recoger un montón de información del equipo, entre ella la que nos interesa. En XP salen tantas líneas que se pierde la información por arriba, y en mi caso, el buffer de la ventana de comandos no conserva todas las líneas cuando vuelvo hacia atrás, así que he tenido que redirigir la salida al comando "less" para que me la muestre paginada
También podríamos haber redirigido esta salida a un fichero de texto y luego abrirlo con el bloc de notas.
Al ejecutar systeminfo, tras unos segundos, durante los cuales vemos unos mensajes indicando qué está haciendo el programa, tenemos una salida tal que así
donde podemos ver que el equipo lleva 4 días y casi 11 horas encendido (penúltima línea de la imagen).
2.4 Mi script personal
Como me gusta la salida en una única línea que proporciona el comando uptime de Linux, me he hecho mi pequeño script en Windows, lo he colocado en la carpeta de utilidades que tengo incluida en el PATH, para poder invocarlo igual que lo hago en Linux. Lo he llamado "uptime.cmd", y su contenido es sencillamente las siguientes dos líneas
(el comando "find" es equivalente al grep de Linux)
Y ahora sí, en mi consola de Windows
Y así no tengo que pensar si estoy en Linux o en Windows, en ambos sitios puedo escribir uptime y respuesta inmediata.
Y ahora pregunto yo...
Dicho todo esto, ¿alguien sabe cómo ver en un smartphone con Android el tiempo que lleva funcionando desde el último reinicio? Seguramente no sea muy complicado, pero le he dedicado unos minutos y no he hallado la respuesta rápidamente. Voy a seguir buscando.
Ahí queda la pregunta
Figura 1. ¿Qué hora es en este reloj hebreo? (Visto en Praga)
1. Respuesta corta
En Linux, MacOs, HP-UX y versiones varias de UNIX: comandos "w", "uptime" y "top"
En Windows: comando "systeminfo"
2. Respuesta larga
2.1 Aplicaciones
Simplemente, queremos saber cuánto lleva encendido el equipo. O bien, somos los responsables de un servidor, y queremos saber si el servidor se ha reiniciado por la noche, por ejemplo. O hemos llegado a casa y hemos pillado a nuestro hijo todo viciado matando orcos a diesto y siniesto. A pesar de que le dijimos que sólo podía jugar una hora al día, tiene los ojos inyectados en sangre, rojos como dos tomates, sospechamos algo y no nos creemos lo que nos jura y perjura de que acaba de encenderlo "hace ná". Queremos comprobar, en todos estos casos, cuánto tiempo lleva el ordenador encendido.
2.2 En Linux
Si el equipo está ejecutando un Linux, bastará con teclear bien poco, una sola letra y hecho. El comando "w" nos da la información que queremos en la primera línea de su salida. Como una imagen vale más que mil palabras, ahí va un ejemplo:
Figura 2. Este equipo lleva 4 días, 4 horas y 14 minutos encendido
Tenemos más información adicional en ese comando, pero la que nos interesa está en la primera línea, junto con los datos de carga del procesador en el último minuto, últimos 5 y últimos 15 minutos. Si lo único que queremos es la información de esa primera línea sin mostrar la otra información (la de los usuarios que hay conectados), entonces podemos hacer un grep para solo mostrar la primera línea, así:
$ w | grep "load average"
(ojo, esto podría sacar también otras líneas que contuvieran esa cadena de texto)
O bien, y mejor aún, ejecutar el comando "uptime", que muestra únicamente esa primera línea.
Figura 3. Uptime como un "w" limitado a la primera línea
Otro comando que está en todos los *NIX modernos y que da esta misma info (más un montón de información adicional) es el comando top. Así, si ejecutamos
$ top
Obtendremos algo así
Figura 4. El comando "top" también nos dice cuánto tiempo lleva encendido el ordenador
Figura 5. htop: top con maquillaje de colores
2.3 En Windows
En todas las versiones de Windows desde XP tenemos el comando "systeminfo", que se encarga de recoger un montón de información del equipo, entre ella la que nos interesa. En XP salen tantas líneas que se pierde la información por arriba, y en mi caso, el buffer de la ventana de comandos no conserva todas las líneas cuando vuelvo hacia atrás, así que he tenido que redirigir la salida al comando "less" para que me la muestre paginada
c:\> systeminfo | less
También podríamos haber redirigido esta salida a un fichero de texto y luego abrirlo con el bloc de notas.
Al ejecutar systeminfo, tras unos segundos, durante los cuales vemos unos mensajes indicando qué está haciendo el programa, tenemos una salida tal que así
Figura 6. Salida de "systeminfo" en Windows XP
donde podemos ver que el equipo lleva 4 días y casi 11 horas encendido (penúltima línea de la imagen).
2.4 Mi script personal
Como me gusta la salida en una única línea que proporciona el comando uptime de Linux, me he hecho mi pequeño script en Windows, lo he colocado en la carpeta de utilidades que tengo incluida en el PATH, para poder invocarlo igual que lo hago en Linux. Lo he llamado "uptime.cmd", y su contenido es sencillamente las siguientes dos líneas
Figura 7. Script para implementar un uptime
(el comando "find" es equivalente al grep de Linux)
Y ahora sí, en mi consola de Windows
Figura 8. Uptime disponible también en Windows
Y así no tengo que pensar si estoy en Linux o en Windows, en ambos sitios puedo escribir uptime y respuesta inmediata.
Y ahora pregunto yo...
Dicho todo esto, ¿alguien sabe cómo ver en un smartphone con Android el tiempo que lleva funcionando desde el último reinicio? Seguramente no sea muy complicado, pero le he dedicado unos minutos y no he hallado la respuesta rápidamente. Voy a seguir buscando.
Ahí queda la pregunta
Publicado por
José Sáez
en
19:15
7 comentarios:


Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
Etiquetas:
encendido,
find,
htop,
less,
linux,
mac,
macos,
ordenador,
reloj,
scripts,
servidor,
systeminfo,
tiempo,
top,
unix,
uptime,
w,
windows
Suscribirse a:
Entradas (Atom)