Shared posts

13 Dec 18:26

The Facebook Files, Protonmail cede datos a la justicia y China prohibe las cryptos.

Noticias distópicas Tras un verano a medio gas, Techtopias recupera su frecuencia quincenal habitual, y lo hacemos con una de las grandes revelaciones del año, los ya famosos The Facebook files, una serie de publicaciones de The Wall Street Journal, que ofrecen un visión de cómo Facebook e Instagram han ayudado a difundir bulos, generar depresión en adolescentes o incrementar la polarización y el enfrentamiento social.
13 Dec 17:52

Sincroniza tus archivos con Syncthing

by davidochobits

Syncthing es un fantástico servicio, que nos va a permitir tener acceso instantáneo a una o más carpetas en muchos dispositivos. Se trata de una solución de sincronización de archivos multiplataforma. Sigue la filosofía...

La entrada Sincroniza tus archivos con Syncthing se publicó primero en ochobitshacenunbyte.

26 Nov 14:35

Firefox ahora envía lo que escribes en la barra de direcciones a Mozilla

by Unknown

 Firefox 93viene con un cambio importante en la barra de direcciones, el cual de hecho, es controvertido si consideramos que el navegador está básicamente orientado a la privacidad y la confidencialidad. Y es que Firefox ahora envía datos de entrada del teclado a los servidores de Mozilla, con el cual argumenta que es el medio por el cual la organización obtiene financiación de socios publicitarios.


Leer más »
26 Nov 12:08

Disponible Ubuntu 21.10, novedades y descarga

by J.Pomeyrol

Ubuntu 21.10

Estamos de lanzamientos hoy y para coronar el día, he aquí Ubuntu 21.10 ‘Impish Indri’, una nueva versión intermedia de «la distribución del pueblo» que… no apunta maneras, no señor. Pero vayamos por partes.

Ubuntu 21.10 es la seguidilla de Ubuntu 21.04 ‘Hiruste Hippo’ labnzada el pasado abril y como esta, cuyo ciclo concluye el próximo enero, constará tan solo de nueve meses de soporte, aunque el procedimiento de actualización a la siguiente versión de Ubuntu estará listo bastante antes de que llegue ese momento.

Novedades de Ubuntu 21.10

Entre las novedades generales de Ubuntu 21.10, extensibles al resto de familia, se encuentra el kernel Linux 5.13 y Mesa 21.2 como componentes destacados. En el caso de Ubuntum, además, se mantiene Wayland por defecto incluso cuando se esté utilizando los controladores privativos de Nvidia, pues esta versión viene con ese soporte listo.

Ubuntu 21.10 destaca asimismo por vestirse por fin de GNOME 40 y aunque GNOME 41 salió hace poco, es lo suficientemente poco como para pedonarle a la distro no adoptarlo. Ahora bien, que podrían haberse preparado porque tiempo de sobra, también. Pero tampoco es un mal trato. De hecho, con GNOME vienen casi todas las novedades a nivel de escritorio.

Otro cambio que salta a la vista en Ubuntu 21.10 incluye el tema claro de Yaru para GTK, ya que es el tema por defecto de las aplicaciones y hacía mucho que Ubuntu no dejaba el oscuro atrás; o la introducción a modo de preview del nuevo instalador de sistema creado con Flutter, aunque no de manera predeterminada: para probarlo hay que descargar imágenes de instalación concretas.

Ubuntu 21.10

Claro que si hay un cambio que, como poco, va a producir una división de opiniones, es el que ya conocíamosFirefox como paquete Snap por defecto, una decisión soberana de Canonical que, no obstamte, va a generar con toda probabilidad aleadas de odio justificadas, y es que el movimiento huele a rancio de lejos. Para más datos, la que se lió con Chromium.

Pero que no cunda el pánico, porque lo malo no viene ahora: Ubuntu 21.10 ofrece Firefox como Snap por defecto, pero solo afecta a la misma Ubuntu -los sabores oficiales se libran de momento del golpe bajo- y en los repositorios está la misma versión del navegador en formato Deb, por lo que cambiar de una a otra cuesta poco. Sin embargo, huele mal el tema, ¿verdad?

Verdad: a partir de Ubuntu 22.04 LTS Firefox desaparecerá de los repositorios tradicionales de Ubuntu y solo estará disponible en formato Snap. Ergo, lo mismo para el resto de ediciones oficiales de Ubuntu, así como para cualquier derivada que no esté por la labor de compilarse el navegador para sí, como hizo Linux Mint con Chromium. Pero, ¿tan malo es usar Firefox como Snap?

En el caso concreto de Firefox, cuenta Canonical que así las actualizaciones le llegarán al navegador conforme se liberen en el upstream, lo cual es una chanza sin gracia alguna, porque lo mismo podrían hacer si quisieran con la versión de los repositorios ordinarios (el PPA de Mozilla Security podría ser la salvación, ya veremos); dice también que será todo más seguro por el aislamiento que proporciona Snap, aunque se supone que Firefox también tiene de eso.

Por otro lado, el Firefox en Snap de Ubuntu 21.10 se estrena con un error grave que hace que explote en determinadas circunstancias en la sesión de Wayland, si bien esperan corregirlo con el lanzamiento de Firefox 94 en noviembre; y no comentan nada de la demora que tienen todas las aplicaciones Snap en su primer arranque, por no entrar en debates que se salen de lo meramente técnico.

Más información en las notas de lanzamiento de Ubuntu 21.10.

Ediciones oficiales de Ubuntu 21.10

Al margen de la edición principal hay una selección de alternativas tan o más interesantes que la propia Ubuntu, las cuales comparten fondo, que no forma, a la postre su gran diferenciador:

Kubuntu 21.10

Así, en el caso de Kubuntu su gran baza para atraer al usuario es KDE Plasma 5.22.5 y KDE Gear 21.08.1, así como la llegada a sus repositorios de Latte Dock 0.10.

Xubuntu 21.10

Xubuntu es otro de los sabores clásicos que lo suplen todo a base de escritorio, y este no es otro que Xfce 4.16, con un buen número de componentes actualizados, eso sí.

Ubuntu MATE 21.10

Algo más actualzado está Ubuntu MATE, cuya nueva versión de entorno de escritorio, MATE 1.26 se lanzó hace un par de meses.

Ubuntu Budgie 21.10

Una de cal, otra de arena y Ubuntu Budgie está ahí ahí, con el Budgie Desktop 10.5.3 (una actualización menor con correcciones, principalmente) como máximo exponente.

Lubuntu 21.10

Y terminamos el repaso más ortodoxo con Lubuntu, que también vio su escritorio actualizarse recientemente. En concreto, LXQt 0.17 es la versión que viste en Impish Indri.

Descarga de Ubuntu 21.10

Por último, ahí tienes las descargas de Ubuntu 21.10 y familia.

26 Nov 11:51

Android espía a los usuarios incluso cuando se desactivan todas las opciones de rastreo

by Unknown

Una nueva investigación pone de relieve que Google no deja de rastrear a los usuarios incluso cuando estos desactivan todas las opciones de seguimiento del sistema operativo.

 


Leer más »
25 Nov 15:16

Kubuntu Focus M2 se renueva con Intel Tiger Lake y NVIDIA RTX 30

by Eduardo Medina

Kubuntu Focus M2

Desde hace poco tenemos entre nosotros a la tercera generación del Kubuntu Focus M2, la renovación del portátil profesional que destaca por sus altas prestaciones y por usar el miembro de la familia Ubuntu como sistema operativo presintalado, más concretamente la versión 20.04 LTS.

El procesador incorporado en el renovado Kubuntu Focus M2 es el Intel Core i7-11800H, correspondiente a la generación Tiger Lake y que incorpora 8 núcleos físicos, 16 hilos (2 hilos por núcleo), 24MB de Smart Cache de Intel, gráficos integrados Gen12 (Xe) y es capaz de trabajar a una frecuencia máxima de 4,6GHz. Es importante tener en cuenta que este componente es fijo y no puede ser modificado en el proceso de compra.

El portátil también incluye la última generación de tecnología de gráficos de NVIDIA, ofreciendo en la configuración base una RTX 3060 de 6GB que puede sustituida por una RTX 3070 de 8GB o una RTX 3080 de 16GB. Aquí nos encontramos con uno de los grandes peros del producto, ya que a NVIDIA no le va mucho eso de cumplir con los estándares, a pesar de los muchos esfuerzos que hay para hacérselos tragar por la fuerza. A eso se suman los problemas de tearing que suelen estar presentes al combinar KDE Plasma con el driver oficial de NVIDIA, cosa que tiene fácil solución siempre que se esté dispuesto a usar la consola. Esperemos que con Wayland la dinámica empiece a cambiar.

Continuando con temas de gráficos, la pantalla es LCD, de 15,6 pulgadas, soporta una resolución nativa Full HD (1920×1080) y trabaja a una tasa de refresco de 144MHz. Cuenta con un revestimiento antideslumbrante y soporta el 90% del espectro de color RGB y el 72% del espectro de color NTSC.

Kubuntu Focus M2 frontal Kubuntu Focus M2 trasero

En lo que respecta a la memoria, el Kubuntu Focus M2 incorpora en su configuración básica 16GB de RAM DDR4 a 3.200MHz configurados en Dual Channel, pudiendo la cantidad ser aumentada hasta los 64GB en el proceso de compra. Para el almacenamiento de datos, de partida hay una unidad SSD NVMe de Samsung de 250GB, una capacidad que puede ser aumentada hasta los 2TB. El comprador puede, si quiere, añadir un segundo SSD NVMe opcional que va de los 250GB hasta los 2TB.

A nivel de conexiones nos encontramos con conector RJ45 para Gigabit Ethernet, Wi-Fi 6 AX 200 de Intel con Bluetooth 5.2, un puerto Thunderbolt 4, tres puertos USB Type-A (rectangulares) 3.2 Gen 1, un puerto de salida HDMI 2.0 con HDCP, un puerto mini DisplaPort 1.4, una cerradura Kensington, un lector de tarjetas microSD, un puerto jack de 3,5mm para micrófono y salida óptica S/PDIF y un puerto jack de 3,5 para auriculares y micrófono.

La batería es de 73Wh, la webcam de un megapíxel (1920×720), el peso de 2 kilogramos aproximadamente y las dimensiones son de 357,5 milímetros de ancho, 238 milímetros de fondo y 19,8 milímetros de alto. Merece la pena mencionar que el teclado retroiluminado soporta una gran variedad de colores y que en la tecla super (también conocida como “tecla Windows”) se muestra el logo de Kubuntu.

La tercera generación del Kubuntu Focus M2 puede ser comprada en la web del fabricante al precio base de 1.945 dólares estadounidenses, que obviamente irá subiendo conforme se vayan mejorando las características de la unidad a comprar.

25 Nov 14:40

Encontraron una vulnerabilidad en el servidor http Apache

by Darkcrizt

Hace poco se dio a conocer la noticia de que se encontró un nuevo vector de ataque contra el servidor http Apache, que permaneció sin parches en la actualización 2.4.50 y permite el acceso a archivos desde áreas fuera del directorio root del sitio.

Además, los investigadores han encontrado una manera de que, en presencia de ciertas configuraciones no estándar, no solo lean los archivos del sistema, sino que también ejecuten remotamente su código en el servidor.

CVE-2021-41773 en Apache HTTP Server 2.4.50 era insuficiente. Un atacante podría usar un ataque de recorrido de ruta para asignar URL a archivos fuera de los directorios configurados por directivas similares a Alias. Si los archivos fuera de estos directorios no están protegidos por la configuración predeterminada habitual «requieren todos denegados», estas solicitudes pueden tener éxito. Si los scripts CGI también están habilitados para estos parches con alias, esto podría permitir la ejecución remota de código. Este problema solo afecta a Apache 2.4.49 y Apache 2.4.50 y no a versiones anteriores.

En esencia, el nuevo problema (ya catalogado como CVE-2021-42013) es completamente similar a la vulnerabilidad original (CVE-2021-41773) en 2.4.49, la única diferencia está en una codificación de caracteres diferente.

Y es que en particular, en la versión 2.4.50 se bloqueó la posibilidad de utilizar la secuencia «% 2e» para codificar un punto, pero se perdió la posibilidad de una doble codificación: al especificar la secuencia «%% 32% 65», el servidor decodificado en «% 2e», y luego en «.», es decir Los caracteres «../» para ir al directorio anterior se pueden codificar como «. %% 32% 65 /».

Ambos CVE son de hecho casi la misma vulnerabilidad de recorrido de ruta (la segunda es la solución incompleta para la primera). El recorrido de la ruta solo funciona desde un URI mapeado (por ejemplo, a través de las directivas Apache «Alias» o «ScriptAlias»). DocumentRoot solo no es suficiente

En cuanto a la explotación de una vulnerabilidad a través de la ejecución de código, esto es posible si mod_cgi está habilitado y se utiliza una ruta base en la que se permite la ejecución de scripts CGI (por ejemplo, si la directiva ScriptAlias ​​está habilitada o se especifica el indicador ExecCGI en la directiva Opciones).

Se menciona que un requisito previo para un ataque exitoso es también proporcionar explícitamente en la configuración de Apache acceso a directorios con archivos ejecutables, como / bin, o acceso a la raíz FS «/». Dado que normalmente no se proporciona dicho acceso, un ataque de ejecución de código es de poca utilidad para los sistemas reales.

Al mismo tiempo, el ataque a la obtención de contenido de archivos de sistema arbitrarios y textos fuente de scripts web que están disponibles para lectura para el usuario bajo el cual se ejecuta el servidor http sigue siendo relevante. Para llevar a cabo un ataque de este tipo, basta con tener un directorio en el sitio configurado utilizando las directivas «Alias» o «ScriptAlias» (DocumentRoot no es suficiente), como «cgi-bin».

Además de ello que menciona que el problema afecta principalmente a distribuciones continuamente actualizadas (Rolling Release) como lo son Fedora, Arch Linux y Gentoo, así como también a los ports de FreeBSD.

Mientras que las distribuciones de Linux que se basan en ramas estables de las distribuciones de servidor como lo son Debian, RHEL, Ubuntu y SUSE no son vulnerables. El problema no aparece si se deniega explícitamente el acceso a los directorios mediante la configuración » requerir todo denegado «.

También vale la pena mencionar que el 6 y 7 de octubre, Cloudflare registró más de 300 mil intentos de explotar la vulnerabilidad CVE-2021-41773 por día. La mayoría de las veces, como resultado de ataques automatizados, solicitan el contenido de «/cgi-bin/.%2e/.git/config», «/cgi-bin/.%2e/app/etc/local.xml», «/cgi-bin/.% 2e/app/etc/env.php» y «/cgi-bin/.%2e/%2e%2e/%2e%2e/etc/passwd».

El problema solo se manifiesta en las versiones 2.4.49 y 2.4.50, las versiones anteriores de la vulnerabilidad no se ven afectadas. Para corregir la nueva variante de la vulnerabilidad, se formó rápidamente el lanzamiento de Apache httpd 2.4.51.

Finalmente si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.

24 Nov 20:35

FontOnLake: nuevo malware dirigido a Linux con capacidades de troyano, backdoor y rootkit

by Unknown

Investigadores de ESET descubren FontOnLake, una familia de malware que utiliza herramientas personalizadas y bien diseñadas para atacar sistemas operativos que funcionan bajo Linux. La naturaleza  de las herramientas de FontOnLake en combinación con su diseño avanzado y baja prevalencia sugieren que ha sido diseñado para ataques dirigidos




Leer más »
24 Nov 20:10

Disponibles Debian 11.1 Bullseye y 10.11 Buster

by Eduardo Medina

debian artwork

Los responsables de Debian han anunciado la publicación de las versiones 10.11 Buster y 11.1 Bullseye, que vienen a ser los últimos lanzamientos de las ramas old stable y stable respectivamente. Como es de esperar, nos encontramos con la aplicación de los parches que se han ido acumulando desde los lanzamientos previos con el fin de evitar la realización de una actualización “pesada” justo después de completar la instalación.

Los lanzamientos estables de Debian tienen un conjunto de software estanco que raras veces es modificada durante el tiempo de vida del sistema, así que de 11.1 Bullseye sobresalen los parches para corregir tanto fallos de software como de seguridad. Entre los fallos de seguridad corregidos, nos encontramos una que permitía la ejecución de código arbitrario (CVE-2021-38173) y otra la “falta la validación de entrada en los nombres de host devueltos por los servidores DNS” (CVE-2021-3672).

En cuanto al kernel, que recordamos que en Bullseye es Linux 5.10, han llegado correcciones para los drivers Radeon (el viejo Open Source para gráficas AMD Radeon), AMDGPU (el “nuevo” para gráficas AMD Radeon) y Nouveau (el libre para gráficas de NVIDIA). Esto se suma a las correcciones aplicadas a los chips de sonido Realtek incorporado a diversos modelos de portátiles de HP.

De Debian 10.11 Buster destaca la eliminación de una gran cantidad de componentes y módulos relacionados con los núcleos 4.19.0-16 y anteriores debido a que ya nos son copilados por Linux. Esto no debería de acarrear ninguna merma a nivel de funcionamiento y características, ya que el kernel actual de Buster es la versión 4.19.0-18. Por lo demás, también están presentes los parches y cambios aplicados para corregir fallos de software y de seguridad, de entre los que sobresale la incorporación de las nuevas versiones de los microcódigos de Intel.

Los que quieran conocer todos los detalles de estos lanzamientos pueden consultar las listas de cambios de Bullseye 11.1 y Buster 10.11 publicadas por Debian. Os dejamos con los enlaces para descargar tanto la actual stable como la old stable de la distribución, aunque si se usa una gráfica Radeon sería recomendable echar un vistazo a las imágenes non-free para garantizar el arranque de los medios en vivo o del propio sistema tras realizar la instalación:

24 Nov 18:40

Uso del comando AWK en Linux y UNIX con ejemplos

by Joan Carles

Hace unas semanas vimos con bastante profundidad y con ejemplos el uso que podíamos dar a la utilidad Sed. Ahora ha llegado el momento de hacer lo mismo pero esta vez con el comando Awk. Como ya dije en su día, si queréis empezar a programar scripts es esencial tener un conocimiento básico de herramientas como sed, awk, grep, cut, etc.

¿QUÉ NOS PERMITE REALIZAR EL COMANDO AWK?

Los usos básicos que podemos dar al comando Awk son los siguientes:

  1. Buscar palabras y patrones de palabras y reemplazarlos por otras palabras y/o patrones.
  2. Hacer operaciones matemáticas.
  3. Procesar texto y mostrar las líneas y columnas que cumplen con determinadas condiciones.
  4. Etc.

Nota: En términos generales el comando awk permite procesar y modificar el texto según nuestras necesidades.

Si leen el artículo verán una serie de explicaciones y ejemplos que les ayudarán a defenderse cuando tengan que utilizar el comando awk.

MOSTRAR EN PANTALLA LAS COLUMNAS QUE QUERAMOS

A continuación veremos una serie de ejemplos que nos ayudarán a comprender como podemos manipular las columnas con el comando awk

Extraer las columnas que queramos de un determinado texto

El comando Awk nos permite seleccionar una columna determinada y mostrarla en pantalla. En mi caso ejecutando el comando ps obtengo la siguiente salida:

joan@gk55:~$ ps
    PID TTY          TIME CMD
 636856 pts/1    00:00:00 bash
 636889 pts/1    00:00:00 ps

Si únicamente queremos mostrar la columna PID ejecutaremos un comando del siguiente tipo:

ps | awk '{print $num_columna}'

Como el número de columna es la 1 entonces ejecutaremos el siguiente comando obteniendo el siguiente resultado.

joan@gk55:~$ ps | awk '{print $1}'
PID
636856
637797
637798

Nota: Colocamos '{}' y dentro de las llaves que introducimos/escribimos la acción que queremos realizar que en este caso es imprimir la columna 1.

Nota: El delimitador por defecto de awk es el espacio. Por lo tanto cada espacio que haya en la salida de texto será considerado como un cambio de columna. Más adelante verán que se puede cambiar el delimitador por defecto.

Si en vez de la primera columna quisiéramos imprimir la segunda ejecutaríamos el siguiente comando:

joan@gk55:~$ ps | awk '{print $2}'
TTY
pts/3
pts/3
pts/3

Si quisiéramos mostrar la primera columna sin mostrar la primera fila entonces ejecutaríamos el siguiente comando:

joan@gk55:~$ ps | awk 'NR>1{print $2}'
pts/3
pts/3
pts/3

Nota: Más adelante encontrarán más ejemplos y explicaciones para entender el uso del parámetro NR.

Cambiar el delimitador por defecto en Awk y extraer la primera columna

En el primer apartado hemos visto que el delimitador por defecto de awk es el espacio, pero en caso de necesidad podemos definir el delimitador que más nos convenga. Imaginemos que ejecutando el comando cat /etc/passwd obtenemos la siguiente salida:

joan@gk55:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
...

Si únicamente queremos mostrar los usuarios del sistema operativo borrando el resto de información tendremos que:

  1. Fijar : como delimitador.
  2. Imprimir la primera columna.

Para hacer lo que acabo de citar ejecutaremos un comando del siguiente tipo:

cat /etc/passwd | awk -F "delimitador" '{print $num_columna}'

Como el delimitador y el número de columna son : y 1 ejecutaré el siguiente comando obteniendo el siguiente resultado:

joan@gk55:~$ cat /etc/passwd | awk -F ":" '{print $1}'
root
daemon
bin
sys
sync
games
...

Extraer varias columnas de texto de forma simultánea con el comando awk

Si queremos extraer varias columnas de forma simultánea lo haremos del siguiente modo:

joan@gk55:~$ cat /etc/passwd | awk -F ":" '{print $1 $3 $4}'
root00
daemon11
bin22
sys33
sync465534
games560
...

La salida es difícil de leer e interpretar porque se imprimen las columnas sin dejar espacios entre ellas. Si queremos añadir espacios entre columnas lo haremos añadiendo los caracteres " " entre las columnas que seleccionamos para imprimir. Por lo tanto para hacer más legible el resultado anterior ejecutaremos el siguiente comando:

joan@gk55:~$ cat /etc/passwd | awk -F ":" '{print $1" "$3" "$4}'
root 0 0
daemon 1 1
bin 2 2
sys 3 3
sync 4 65534
games 5 60
...

Si en vez de un espacio quisiéramos añadir una tabulación reemplazaríamos " " por "\t" obteniendo el siguiente resultado:

joan@gk55:~$ cat /etc/passwd | awk -F ":" '{print $1"\t"$3"\t"$4}'
root	0	0
daemon	1	1
bin		2	2
sys		3	3
sync	4	65534
games	5	60
...

Nota: Otra opción para hacer que el formato sea más legible sería usar printf en vez de print. Más adelante veréis ejemplos de como se puede usar printf.

Fijar un delimitador con la opción FS e imprimir varias columnas

Mediante la opción FS «Field Separator» también podemos fijar un delimitador. Para ello deberemos usar un comando del siguiente tipo:

awk 'BEGIN{FS=":";} {print $1"\t"$3"\t"$4}'

Por lo tanto si volvemos al caso del apartado anterior y queremos imprimir las columnas 1, 3 y 4 lo haremos del siguiente modo:

joan@gk55:~$ cat /etc/passwd | awk 'BEGIN{FS=":";} {print $1"\t"$3"\t"$4}'
root	0	0
daemon	1	1
bin	2	2
sys	3	3
sync	4	65534
games	5	60
...

Nota: El comando ejecutado es equivalente a awk 'BEGIN{FS=":";} {print $1"\t"$3"\t"$4}' /etc/passwd o al cat /etc/passwd | awk -F ":" '{print $1"\t"$3"\t"$4}'
Nota: Toda acción definida dentro de las llaves de BEGIN se ejecuta antes de procesar el fichero de texto /etc(passwd)

Combinar el uso de FS con OFS en awk para tener un delimitador en la salida mostrada en pantalla

Si queremos combinar el uso de FS «field separator» con OFS «Output field separator» tendremos que proceder del siguiente modo.

La opción FS sirve para fijar el separador y la opción OFS define el separador de salida que usaremos para mostrar las columnas seleccionadas en pantalla.

Por ejemplo si queremos mostrar las columnas 1, 3 y 4 del comando cat etc/passwd y que las columnas de salida estén separadas por - entonces usaremos el siguiente comando:

joan@gk55:~$ cat /etc/passwd | awk 'BEGIN{FS=":";OFS=" - "} {print $1,$3,$4}'
root - 0 - 0
daemon - 1 - 1
bin - 2 - 2
sys - 3 - 3
sync - 4 - 65534
games - 5 - 60
...

Imprimir en pantalla únicamente el último delimitador de una salida con awk mediante $NF

Imaginemos que la salida del comando cat /etc/shells es la siguiente:

joan@gk55:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash

Si os fijáis, el nombre de la shell a veces está en la segunda columna y a veces en la tercera columna. Pero lo que es común en todas las salidas es que el nombre de la shell esté en el último delimitador. Para Imprimir el contenido que está después del último delimitador ejecutaremos un comando del siguiente tipo:

awk -F "/" '/^\// {print $NF}'

Cada uno de los parámetros del comando que acabáis de leer hace lo siguiente:

-F "/": Establecemos que el delimitador usado por awk será /

/^\//: Entre // introducimos ^\/ que es una expresión regular que significa toda línea que empiece por /

{print $NF}: Hace referencia a imprimir el último delimitador en todas las líneas que se cumpla la expresión regular ^\/

Si ahora llevamos la teoría a la práctica ejecutaremos el siguiente comando obteniendo el siguiente resultado:

joan@gk55:~$ awk -F "/" '/^\// {print $NF}' /etc/shells
sh
bash
bash
rbash
rbash
dash
dash

El comando anterior veréis que muestra shells duplicadas. Si queremos eliminar las shell duplicadas usaremos el comando uniq del siguiente modo:

joan@gk55:~$ awk -F "/" '/^\// {print $NF}' /etc/shells | uniq
sh
bash
rbash
dash

Imprimir el contenido del penúltimo o antepenúltimo delimitador mediante $NF

En el apartado anterior imprimimos el contenido del último delimitador. Si queremos imprimir el penúltimo tan solo tenemos que reemplazar $NF por %(NF-1). Si lo hacemos el resultado obtenido será:

joan@gk55:~$ awk -F "/" '/^\// {print $(NF-1)}' /etc/shells
bin
bin
bin
bin
bin
bin
bin

Si quisiéramos imprimir el antepenúltimo delimitador deberíamos usar $(NF-2)

joan@asus:~$ awk -F "/" '/^\// {print $(NF-2)}' /etc/shells


usr

usr

usr

OPERAR CON LÍNEAS DE TEXTO MEDIANTE EL COMANDO AWK

Hasta el momento hemos visto varios métodos para imprimir las columnas de texto que nos interesan. Del mismo modo que imprimimos las columnas de texto que nos interesan también podemos imprimir las filas o líneas de texto que nos interesen. Para ello deberéis proceder del siguiente modo.

Imprimir únicamente las líneas que sigan un determinado patrón

En mi caso la salida del comando df es la siguiente:

joan@gk55:~$ df
S.ficheros          bloques de 1K   Usados Disponibles Uso% Montado en
udev                      3949508        0     3949508   0% /dev
tmpfs                      797996     1304      796692   1% /run
/dev/sda5                28767268 13356764    13926168  49% /
tmpfs                     3989968    31068     3958900   1% /dev/shm
tmpfs                        5120        4        5116   1% /run/lock
tmpfs                     3989968       16     3989952   1% /tmp
/dev/sda4                66559996 26678488    39881508  41% /media/DATOS
/dev/sda6                40054040 16034856    21954800  43% /home
/dev/sda8                  507904    50252      457652  10% /boot/efi
tmpfs                      797992       56      797936   1% /run/user/1000

Si únicamente queremos mostrar en pantalla las líneas que empiezan por / usaremos un comando del siguiente tipo:

df | awk '/expresión_regular/ {print}'

En el apartado anterior hemos visto que la expresión regular para definir todas las líneas que empiezan por / es ^\/. Por lo tanto el comando para que únicamente se muestren las líneas que empiecen por / será el siguiente:

joan@gk55:~$ df | awk '/^\// {print}'
/dev/sda5                28767268 13356764    13926168  49% /
/dev/sda4                66559996 26678488    39881508  41% /media/DATOS
/dev/sda6                40054040 16033804    21955852  43% /home
/dev/sda8                  507904    50252      457652  10% /boot/efi

Y si únicamente queremos mostrar la línea que empieza por /dev/sda5 ejecutaremos el siguiente comando:

joan@gk55:~$ df | awk '/^\/dev\/sda5/ {print}'
/dev/sda5                28767268 13356764    13926168  49% /

Mostrar únicamente las líneas que empiezan o finalizan por un determinado patrón

Anteriormente ya hemos visto ejemplos para imprimir únicamente las líneas que empiezan por una letra determinada o por un patrón determinado. Por lo tanto para imprimir las líneas de la salida del comando df que empiezan por la palabra tmpfs ejecutaremos el siguiente comando:

joan@gk55:~$ df | awk '/^tmpfs/ {print}'
tmpfs                 298144       916      297228   1% /run
tmpfs                1490708    149436     1341272  11% /dev/shm
tmpfs                   5120         4        5116   1% /run/lock
tmpfs                 298140        56      298084   1% /run/user/1000

Si ahora queremos mostrar únicamente las líneas que terminan por /shm deberemos cambiar la expresión regular ^tmpfs por \/shm$. De este modo podéis ver que conseguimos nuestro objetivo:

joan@gk55:~$ df | awk '/\/shm$/ {print}'
tmpfs                1490708    155580     1335128  11% /dev/shm

Y si únicamente quisiéramos mostrar las líneas que empiezan por tmpfs y a la vez terminan por /shm lo haríamos del siguiente modo:

joan@gk55:~$ df | awk '/\/shm$/ && /^tmpf/ {print}'
tmpfs                1490708    134808     1355900  10% /dev/shm

Mostrar las columnas que queramos de únicamente las líneas que cumplen una determinada condición

En el ejemplo del apartado anterior se mostraban la totalidad de columnas de las líneas que empiezan por /. Si en vez de mostrar todas las columnas tan solo quiero mostrar la 1, la 2 y la 3 procederemos del siguiente modo:

joan@gk55:~$ df -h | awk '/^\// {print $1"\t"$2"\t"$3}'
/dev/sda5	28G		13G
/dev/sda4	64G		26G
/dev/sda6	39G		16G
/dev/sda8	496M	        50M

Si ahora queremos sumar las columnas 2 y 3 para obtener el espacio total de cada partición lo podemos hacer del siguiente modo:

joan@gk55:~$ df -h | awk '/^\// {print $1"\t"$2 + $3}'
/dev/sda5	41
/dev/sda4	90
/dev/sda6	55
/dev/sda8	546

Y si queremos que se siga mostrando la unidad de capacidad de almacenamiento:

joan@gk55:~$ df -h | awk '/^\// {print $1"\t"$2 + $3"G"}'
/dev/sda5	41G
/dev/sda4	90G
/dev/sda6	55G
/dev/sda8	546G

Mostrar únicamente las líneas que tengan una longitud de caracteres determinada mediante lenght

Si queremos imprimir las líneas del fichero /etc/shells que tienen una longitud superior a 9 caracteres ejecutaremos el siguiente comando:

joan@gk55:~$ awk ' length($0) > 9 ' /etc/shells
# /etc/shells: valid login shells
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/usr/bin/dash

Nota: Del mismo modo que hemos usado length($0) > 9 podríamos haber usado length($0) < 9, length($0) == 9 o length($0) != 9.

Mostrar filas que deben cumplir con varias condiciones de forma simultanea con el operador &&

Mediante el operador && podemos imprimir o mostrar las líneas que cumplan con 2 o más condiciones. Por ejemplo si queremos mostrar las líneas de salida del comando df -h que empiezan por t y cuya columna 6 tenga más de 8 caracteres ejecutaremos el siguiente comando:

joan@gk55:~$ sudo df -h | awk ' /^t/ && length($6) > 8 {print $0} '
tmpfs            5,0M   4,0K  5,0M   1% /run/lock
tmpfs            292M    52K  292M   1% /run/user/1000

Ver la longitud de cada una de las líneas con el comando awk mediante ‘{print length}’

Para saber el número de caracteres de cada una de las líneas del fichero /etc/shells lo haremos mediante el siguiente comando:

joan@gk55:~$ awk '{print length}' /etc/shells
33
7
9
13
10
14
9
13

Si además de escribir el número de caracteres también queremos escribir el contenido de la línea:

joan@gk55:~$ awk '{print length"\t"$0}' /etc/shells
33	# /etc/shells: valid login shells
7	/bin/sh
9	/bin/bash
13	/usr/bin/bash
10	/bin/rbash
14	/usr/bin/rbash
9	/bin/dash
13	/usr/bin/dash

En este apartado hemos visto como imprimir el número de caracteres de un línea entera. Si únicamente queremos imprimir el número de caracteres de la columna 1 de la salida del comando df -h lo haremos del siguiente modo:

joan@gk55:~$ sudo df -h | awk '{print length($1)"\t"$1}'
10	S.ficheros
4	udev
5	tmpfs
9	/dev/sda1
5	tmpfs
5	tmpfs
10	compartida
5	tmpfs

Y si queremos eliminar la primera de la salida del comando df añadiríamos el parámetro NR>1 del siguiente modo:

joan@gk55:~$ sudo df -h | awk 'NR>1{print length($1)"\t"$1}'
4	udev
5	tmpfs
9	/dev/sda1
5	tmpfs
5	tmpfs
10	compartida
5	tmpfs

Imprimir la longitud de únicamente las líneas que tengan un determinado número de caracteres

Si ahora queremos imprimir la longitud de únicamente las líneas que tienen una longitud superior a 9 caracteres tan solo tenemos que combinar los comandos de los últimos apartados del siguiente modo:

joan@gk55:~$ awk ' length($0) > 9 {print length} ' /etc/shells
33
13
10
14
13

Imprimir todas las líneas cuyo el último delimitador sea igual a una determinada palabra mediante el condicional if

En mi caso la salida del comando ps -ef es la siguiente:

joan@gk55:~$ ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 17:11 ?        00:00:01 /sbin/init
root           2       0  0 17:11 ?        00:00:00 [kthreadd]
root           3       2  0 17:11 ?        00:00:00 [rcu_gp]
root           4       2  0 17:11 ?        00:00:00 [rcu_par_gp]
...

Si queremos obtener un listado de procesos cuyo último delimitador contenga la palabra firefox podemos usar lo aprendido hasta ahora conjuntamente con el comando if. Para conseguir nuestro propósito lo haremos del siguiente modo:

joan@gk55:~$ ps -ef | awk '{ if($NF == "firefox") print $0}'
joan       12642       1  0 09:42 ?        00:00:00 /bin/sh -c firefox
joan       12643   12642 14 09:42 ?        00:59:13 firefox

Nota: Podemos usar varios operadores como por ejemplo ==, !=, >, <
Nota: En apartados anteriores hemos visto que el último delimitador se define como $NF.
Nota: $0 hace referencia a todas las columnas.

Si únicamente quisiéramos imprimir el número de proceso y el último delimitador usaríamos el siguiente comando:

joan@gk55:~$ ps -ef | awk '{ if($NF == "firefox") print $2" "$NF}'
12642 firefox
12643 firefox

Contar el número de líneas de un fichero o de la salida de un comando con NR (Número de registros)

Para mostrar el número de líneas que tiene un fichero o la salida de un comando usaremos el parámetro NR. Por lo tanto para imprimir el número de líneas que tiene el fichero /etc/shells lo haremos del siguiente modo:

joan@gk55:~$ awk '{print NR}' /etc/shells
1
2
3
4
5
6
7
8

Sí únicamente queremos obtener el número total de líneas añadiremos el parámetro END del siguiente modo:

joan@gk55:~$ awk 'END {print NR}' /etc/shells
8

Nota: Toda acción precedida del comando END solo se ejecutará una vez cuando se haya procesado la salida del fichero /etc/shells

Imprimir la primera línea de un fichero o de la salida de un comando con la opción NR

La opción NR también no servirá para imprimir la línea de texto que nosotros queramos. Por ejemplo si queremos imprimir la primera línea de la salida del comando ps -aux lo haremos del siguiente modo:

joan@gk55:~$ ps -aux | awk 'NR==1{print $0}'
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

Y si únicamente queremos imprimir la segunda línea lo haremos así:

joan@gk55:~$ ps -aux | awk 'NR==2{print $0}'
root           1  0.0  0.3 163980  9400 ?        Ss   08:52   0:01 /sbin/init

Imprimir todas las filas de un fichero a partir de una determinada línea mediante la opción NR

Para imprimir todas las líneas de la salida del comando ps -aux excepto las 2 primeras lo haremos de forma similar al apartado anterior, pero en vez de usar el operador == usaremos el operador >

joan@gk55:~$ ps -aux | awk 'NR>2{print $0}'
root           2  0.0  0.0      0     0 ?        S    08:52   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   08:52   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   08:52   0:00 [rcu_par_gp]
...

Lo que estamos haciendo con el comando ejecutado es imprimir todos los registros del fichero excepto el 1 y el 2 que corresponden obviamente a la primera y segunda línea.

Imprimir todas las línea de un documento o salida que empiezan con un determinado carácter o string

Si quisiéramos imprimir todos los procesos que están corriendo en nuestro sistema operativo podemos usar el siguiente comando:

joan@gk55:~$ ps -aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.3 163980  9388 ?        Ss   08:52   0:01 /sbin/init
root           2  0.0  0.0      0     0 ?        S    08:52   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   08:52   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   08:52   0:00 [rcu_par_gp]
...

En la primera columna $1 figura el usuario que ha iniciado el proceso. Si queremos imprimir los detalles de los procesos iniciados por usuario cuyo nombre empieza por a o por m, lo haremos del siguiente modo:

joan@gk55:~$ ps -aux | awk '$1 ~ /^[a,m]/ {print $0}'
avahi        451  0.0  0.1   7272  3132 ?        Ss   08:52   0:00 avahi-daemon: running [asus.local]
message+     455  0.0  0.1   8908  4572 ?        Ss   08:52   0:01 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
avahi        471  0.0  0.0   7092   316 ?        S    08:52   0:00 avahi-daemon: chroot helper

Si queremos el mismo resultado que acabamos de obtener mostrando la cabecera que en este caso será la primera línea lo haremos del siguiente modo:

joan@gk55:~$ ps -aux | awk 'NR==1{print $0}' && ps -aux | awk '$1 ~ /^[a,m]/ {print $0}'
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
avahi        451  0.0  0.1   7272  3096 ?        Ss   08:52   0:00 avahi-daemon: running [asus.local]
message+     455  0.0  0.1   8908  4572 ?        Ss   08:52   0:01 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
avahi        471  0.0  0.0   7092   304 ?        S    08:52   0:00 avahi-daemon: chroot helper

Imprimir eliminando los x primero caracteres de cada línea mediante el parámetro substr

En mi caso la salida del comando /etc/shells es la siguiente:

joan@gk55:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash

Si queremos imprimir la salida eliminando por ejemplo los 5 primeros caracteres de cada una de las líneas lo haremos del siguiente modo:

joan@gk55:~$ cat /etc/shells | awk '{print substr($0, 5)}'
etc/shells: valid login shells
/sh
/bash
/bin/bash
/rbash
/bin/rbash
/dash
/bin/dash

Como hemos visto anteriormente, si queremos borrar la primera línea de la salida del comando lo haremos mediante el parámetro NR>1 del siguiente modo:

joan@gk55:~$ cat /etc/shells | awk 'NR>1 {print substr($0, 5)}'
/sh
/bash
/bin/bash
/rbash
/bin/rbash
/dash
/bin/dash

Nota: El primer parámetro del comando substr sirve para definir la columna en la que operamos. El segundo parámetro es para definir los caracteres que queremos recortar.

Imprimir un rango de líneas determinadas mediante el comando awk y NR

Si en la salida del comando cat /etc/shells únicamente queremos imprimir las líneas o registros 2, 3 y 4 lo haremos del siguiente modo:

joan@gk55:~$ cat /etc/shells | awk 'NR==2, NR==4 {print $0}'
/bin/sh
/bin/bash
/usr/bin/bash

Si a la salida del comando que acabamos de ejecutar le quisiéramos añadir los número de línea lo haríamos del siguiente modo:

joan@gk55:~$ cat /etc/shells | awk 'NR==2, NR==4 {print NR, $0}'
2 /bin/sh
3 /bin/bash
4 /usr/bin/bash

Saber en que posición de una línea aparece una palabra o combinación de letras determinada mediante match y RSTART

Para saber la posición en que aparece una palabra o cadena de caracteres usaremos los parámetros match y RSTART. Su funcionamiento lo veréis en el siguiente ejemplo.

Para ver la posición en que aparece la palabra cpu en la salida del comando ps -aux ejecutaremos el siguiente comando:

joan@gk55:~$ ps -aux | awk 'match($0, /cpu/) {print $0 " Contiene la palabra \"cpu\" en la posición " RSTART}'
root           9  0.0  0.0      0     0 ?        I<   08:52   0:00 [mm_percpu_wq] Contiene la palabra "cpu" a la posición 75
root          15  0.0  0.0      0     0 ?        S    08:52   0:00 [cpuhp/0] Contiene la palabra "cpu" en la posición 69
root          16  0.0  0.0      0     0 ?        S    08:52   0:00 [cpuhp/1] Contiene la palabra "cpu" en la posición 69
root          21  0.0  0.0      0     0 ?        S    08:52   0:00 [cpuhp/2] Contiene la palabra "cpu" en la posición 69

La función match($0, /cpu/) busca todas las líneas que contienen un determinado patrón que en el caso del ejemplo es las letras cpu. Entonces mediante print y RSTART se imprimen o muestran en pantalla mostrando la posición en que aparece el patrón que estamos buscando.

Mostrar la longitud de un patrón mediante el parámetro RLENGHT

En el ejemplo del apartado anterior añadiremos que se muestre la longitud del patrón o texto que estamos buscando. Lo haremos con el parámetro RLENGTH del siguiente modo:

joan@gk55:~$ ps -aux | awk 'match($0, /cpu/) {print $0 " La longitud de la expresión buscada es " RSTART" La longitud del parámetro buscado es " RLENGTH}'
root           9  0.0  0.0      0     0 ?        I<   08:52   0:00 [mm_percpu_wq] La longitud de la expresión buscada es 75 La longitud del parámetro buscado es 3
root          15  0.0  0.0      0     0 ?        S    08:52   0:00 [cpuhp/0] La longitud de la expresión buscada es 69 La longitud del parámetro buscado es 3
root          16  0.0  0.0      0     0 ?        S    08:52   0:00 [cpuhp/1] La longitud de la expresión buscada es 69 La longitud del parámetro buscado es 3
root          21  0.0  0.0      0     0 ?        S    08:52   0:00 [cpuhp/2] La longitud de la expresión buscada es 69 La longitud del parámetro buscado es 3
joan      411346  0.0  0.1  11300  3040 pts/0    R+   14:01   0:00 awk match($0, /cpu/) {print $0 " La longitud de la expresión buscada es " RSTART" La longitud del parámetro buscado es " RLENGTH} La longitud de la expresión buscada es 83 La longitud del parámetro buscado es 3

REALIZAR OPERACIONES MATEMÁTICAS CON EL COMANDO AWK

Awk permite realizar operaciones matemáticas con los números de un fichero de texto o con los números que generan las salidas de los comandos. También es capaz de por ejemplo realizar operaciones matemáticas con valores almacenados en variables. Algunos ejemplos de lo que acabo de citar son los siguientes.

Realizar operaciones matemáticas con variables y awk

Si tenemos una variable a al que le asignamos el valor 10 y una variable b al que le asignamos el valor 20 podemos ejecutar el siguiente comando:

joan@gk55:~$ awk -v a="10" -v b="20" 'BEGIN {print "La multiplicación de a x b es", a*b;}'
La multiplicación de a x b es 200

Nota: Tenemos que usar la BEGIN porque no hay ninguna salida de texto o fichero a procesar. Todo lo que está dentro de BEGIN se ejecuta antes de procesarse un fichero o la salida de un comando. En contraposición END es todo lo que se ejecuta después de haber sido procesado un fichero o una salida de comando.

Nota: La forma de asignar una variable en awk es -v variable="valor"

Awk también permite llamar a variables que tenemos declaradas en nuestra shell de bash. Para ello lo haremos del modo que se muestra en el siguiente ejemplo:

joan@gk55:~$ a=1.5
joan@gk55:~$ b=4
joan@gk55:~$ awk -v a="$a" -v b="$b" 'BEGIN {print "La multiplicación de a x b es", a*b;}'
La multiplicación de a x b es 6

Calcular la raíz cuadrada de un número mediante awk

Del mismo modo que realizamos una suma podemos realizar restas, divisiones, multiplicaciones, etc. Así que se queremos obtener la raíz cuadrada de 400 lo haremos del siguiente modo:

joan@gk55:~$ awk 'BEGIN{print sqrt(400)}'
20

También podemos obtener un listado que nos proporcione resultados de la raíz cuadrada de una serie de números. Para ello podemos hacer uso de un bucle for de la siguiente forma:

joan@gk55:~$ awk 'BEGIN { for(i=1; i<=10; i++) print "La raíz cuadrada de", i*i, "es", i;}'
La raíz cuadrada de 1 es 1
La raíz cuadrada de 4 es 2
La raíz cuadrada de 9 es 3
La raíz cuadrada de 16 es 4
La raíz cuadrada de 25 es 5
La raíz cuadrada de 36 es 6
La raíz cuadrada de 49 es 7
La raíz cuadrada de 64 es 8
La raíz cuadrada de 81 es 9
La raíz cuadrada de 100 es 10

Y en el caso que quisieran obtener la raíz cuadrada de todos los números existentes entre el 0 y el 1 lo podrían hacer del siguiente modo:

joan@gk55:~$ awk 'BEGIN { for(i=0; i<=1; i=i+0.00001) print "La raíz cuadrada de", i*i, "es", i;}'
...
...
...
La raíz cuadrada de 0.99986 es 0.99993
La raíz cuadrada de 0.99988 es 0.99994
La raíz cuadrada de 0.9999 es 0.99995
La raíz cuadrada de 0.99992 es 0.99996
La raíz cuadrada de 0.99994 es 0.99997
La raíz cuadrada de 0.99996 es 0.99998
La raíz cuadrada de 0.99998 es 0.99999

EJECUTAR SCRIPTS CON EL COMANDO AWK

Como dijimos en el inicio del artículo awk es un lenguaje de programación. Podemos construir funciones, bucles y generar scripts usando el lenguaje awk. En nuestro caso definiremos un script para trabajar con los resultados que nos devuelve el comando df.

joan@gk55:~$ sudo df
S.ficheros     bloques de 1K    Usados Disponibles Uso% Montado en
udev                 1467404         0     1467404   0% /dev
tmpfs                 298144       904      297240   1% /run
/dev/sda1           56648848  13155828    40582968  25% /
tmpfs                1490708    351400     1139308  24% /dev/shm
tmpfs                   5120         4        5116   1% /run/lock
compartida         499451928 415539964    83911964  84% /media
tmpfs                 298140        56      298084   1% /run/user/1000

Lo que hará el script será lo siguiente:

  1. Mostrar solo las líneas que empiecen por la letra t y cuya capacidad disponible (Columna 4 «$4») sea mayor a 6000k
  2. De las columnas que se pueden mostrar solo imprimiremos en pantalla la (Columna 1 «$1»), que corresponde a la unidad, y la suma de la columnas 2 y 3 que corresponderá al espacio disponible.

Para generar un script simple con nombre capacidad.awk ejecutaremos el siguiente comando:

joan@gk55:~$ nano capacidad.awk

Una vez se abra el editor de textos escribiremos las instrucciones para conseguir nuestro propósito. En nuestro caso el código es el siguiente:

#!/usr/bin/awk -f

BEGIN { printf "%s\n","Voy a extraer las partes que me interesan del comando df" }
BEGIN { printf "%s\t%s\n","Unidad","Capacidad disponible" }
/^t/  && $4 > 6000 {print $1"\t"$2 + $3"K"}

Ahora ejecutaremos el script del siguiente modo y veremos que obtenemos el resultado deseado:

joan@gk55:~$ sudo df | awk -f capacidad.awk 

Voy a extraer las partes que me interesan del comando df

Unidad	Capacidad disponible
tmpfs	299048K
tmpfs	1845180K
tmpfs	298196K

Si también quisiéramos añadir las líneas que empiezan por c dejaríamos el script capacidad.awk del siguiente modo:

#!/usr/bin/awk -f

BEGIN { printf "%s\n","Voy a extraer las partes que me interesan del comando df" }
BEGIN { printf "%-12s %-3s\n","Unidad","Capacidad disponible" }
/^t/  && $4 > 6000 {printf "%-12s %-23s\n", $1, $2+$3"K"}
/^c/  && $4 > 6000 {printf "%-12s %-23d\n", $1, $2+$3"K"}

Nota: Si os fijáis en el contenido del script veremos que usamos la opción printf en lugar de print. De esta forma podemos dar formato a los datos de salida mostrados en pantalla. Los parámetros del comando printf harán lo siguiente:

%-: Justificar el texto a la izquierda.
%: Justificar el texto a la derecha.
12s: String de 12 caracteres.
23d: 23 caracteres con formato numérico decimal.
\n: Inserta una nueva línea.

Y el resultado obtenido seria el siguiente:

joan@gk55:~$ sudo df | awk -f capacidad.awk 
Voy a extraer las partes que me interesan del comando df
Unidad       Capacidad disponible
tmpfs        299048
tmpfs        1602408
compartida   923949580
tmpfs        298196

BUSCAR Y REEMPLAZAR TEXTO CON CON EL COMANDO AWK Y GSUB

Mediante la función gsub podemos buscar y reemplazar texto con awk de forma similar a como lo podemos hacer con sed. La función gsub se utiliza del siguiente modo:

gsub("letra_palabra_o_expresión_regular_a_buscar", "texto_que_reemplaza_el_buscado", lugar_donde_realizar_sustitución)

Buscar una expresión regular, palabra o letra y reemplazarla por otra

Por lo tanto si partimos del fichero de texto geekland.txt que tiene el siguiente contenido:

Geekland es el mejor blog, de tecnología

Y queremos reemplazar todas las G por g ejecutaremos el siguiente comando y obtendremos el siguiente resultado:

joan@gk55:~$ awk '{ gsub("G","g",$0); print $0 }' geekland.txt
geekland es el mejor blog, de tecnología

Buscar y reemplazar texto en únicamente una columna determinada

En nuestro caso la salida del comando df -h es la siguiente:

joan@gk55:~$ sudo df -h
S.ficheros     Tamaño Usados  Disp Uso% Montado en
udev             1,4G      0  1,4G   0% /dev
tmpfs            292M   916K  291M   1% /run
/dev/sda1         55G    13G   39G  25% /
tmpfs            1,5G   122M  1,4G   9% /dev/shm
tmpfs            5,0M   4,0K  5,0M   1% /run/lock
compartida       477G   408G   69G  86% /media
tmpfs            292M    68K  292M   1% /run/user/1000

Siguiendo el mismo procedimiento que en el apartado anterior, si en la segunda columna queremos reemplazar todas las M por G procederemos del siguiente modo:

joan@gk55:~$ sudo df -h | awk '{ gsub("M","G",$2); print $2 }'
Tamaño
1,4G
292G
55G
1,5G
5,0G
477G
292G

Si en vez de imprimir la primera columna queremos imprimir la primera y la segunda de forma que la tabulación sea perfecta usaremos printf del siguiente modo:

joan@gk55:~$ sudo df -h | awk '{ gsub("M","G",$2); printf "%-12s %-12s\n",$1,$2 }'
S.ficheros   Tamaño      
udev         1,4G        
tmpfs        292G        
/dev/sda1    55G         
tmpfs        1,5G        
tmpfs        5,0G        
compartida   477G        
tmpfs        292G 

OTROS USOS QUE PODEMOS DAR AL COMANDO AWK

Hemos visto que el comando awk tiene multitud de usos. A continuación y para finalizar el artículo mostraremos un par de usos simples no detallados anteriormente.

Imprimir el contenido de un fichero con el comando awk

Awk se puede utilizar de forma similar al comando cat para mostrar el contenido de los ficheros de nuestro equipo. A modo de ejemplo para visualizar el contenido del fichero functions.php lo podemos hacer del siguiente modo.

joan@gk55:~/Nube$ awk '{print}' functions.php 
<?php
/**
 * Twenty Nineteen functions and definitions
 *
 * @link https://developer.wordpress.org/themes/basics/theme-functions/
 *
 * @package WordPress
 .....

Ejecutar un comando de bash mediante el comando awk

Awk permite ejecutar comandos bash sin ningún tipo de problema. Si por ejemplo queremos usar el comando pwd para imprimir la ruta en la que estamos ejecutaremos el siguiente comando:

joan@gk55:~$ awk 'BEGIN { system("pwd") }'
/home/joan

Si creen que hay usos interesantes del comando awk que no he citado les ánimo a escribir en los comentarios del blog.

Fuentes

https://www.um.es/innova/OCW/informatica-para-universitarios/ipu_docs/la_shell/awk.pdf

https://www.baeldung.com/linux/awk-guide

La entrada Uso del comando AWK en Linux y UNIX con ejemplos se publicó primero en geekland.

24 Nov 11:36

DuckDuckGo y Ecosia piden a la UE que prohíba a Google ser el buscador por defecto en navegadores y sistemas operativos

by Unknown

 Cuatro motores de búsqueda rivales de Google han pedido a los legisladores de la Unión Europea, en una carta abierta, que aborden el continuo dominio del mercado por parte del gigante tecnológico y que se establezcan normas para los menús de preferencias de los motores de búsqueda.


Leer más »
20 Oct 17:07

#07 - Peertube y Planeta KDE

by kde_express@kde-espana.org (KDE Express Team)

Se acerca el aniversario de KDE, pero antes tenemos tiempo de tratar temas de todo tipo sobre todo relacionados con la promoción del trabajo de la comunidad. Si tienes 20 minutos (o 12 a 1.75x) escucharas en que andamos metidos y eventos que vienen de camino entre otros temas de los que os dejamos a continuación los enlaces.

Artículo original en https://kdeexpress.gitlab.io/07/

Si no ves nada tras esta linea, es que tu app no sabe leer bien el feed RSS, avisales o prueba otra ;)

Enlaces mencionados:


Puedes escuchar este episodio y seguir el podcast en tu propia aplicación facilmente con este enlace a Podlink o este a Podnews.

Transcripción a texto y subtítulos más abajo 👇, en la web steno.fm o en estas apps.

Este podcast tiene licencia Reconocimiento-CompartirIgual 4.0 Internacional (CC BY-SA 4.0).

15 Oct 19:47

Retos del software libre (Podcast)

by masgnulinux
En el software libre no todo es bueno ni todo el monte es orégano, ni mucho menos, tiene numerosos retos. Unos se pueden superar, otros difícilmente. Descarga libre en PDF
15 Oct 17:04

B.U.G.S. núm. 64 – “Fiesta de pijamas”

by Pedro Pérez Gómez
15 Oct 13:44

Interview with TheKit

by Koen Vervloesem
We had a little chat with TheKit, who is known in the UBports community for his porting efforts. * * **Can you briefly introduce yourself?** I’m mostly known in the SailfishOS and UBports communiti...
15 Oct 07:27

Brócoli sin aburrimiento: técnicas para cocinarlo y una receta 'tandoori' | EL COMIDISTA

by El Comidista en EL PAÍS

¿Por qué siempre se pone el brócoli como ejemplo de comida aburrida?
¿Qué ha hecho esta verdura para ser sinónimo de castigo? Más que
culparla a ella, deberíamos pensar en las perrerías que se le han hecho
-y se le siguen haciendo- en la cocina hasta convertirla en un bodrio
insufrible. Hablo de esos hervidos laaaargos que la transforman en algo
descolorido, pastoso, aguachado y con olor a cuesco, como mucho
aderezado con un refrito de ajo tristón.
Respetado en su punto de
cocción y usado con inteligencia, el brócoli puede darte muchas alegrías
en la mesa. Prueba de ello es el brócoli tandoori que preparan en el
restaurante Cruix de Barcelona, uno de los mejores platos con esta
hortaliza que hemos probado últimamente. Su chef, Miquel Pardo, nos
enseñó la receta, y también algunos trucos para usar el brócoli en otro
tipo de platos.
RECETA ESCRITA: https://bit.ly/brocolicomidista
Suscríbete a nuestro canal: http://cort.as/-9ysp
Visita: https://elcomidista.elpais.com
Síguenos en Facebook: https://www.facebook.com/elcomidista
Síguenos en Twitter: https://twitter.com/ElComidista Síguenos en Instagram:
https://www.instagram.com/elcomidista
15 Oct 07:20

Install Party el sábado 16 en Linux Center

by Miguel Menéndez

Una Install Party es un evento en el mundo real en el que se ayuda a instalar una distribución de GNU/Linux. Este evento está orientado a personas que pueden conocer GNU/Linux pero no se animan a instalarlo en sus ordenadores. Para participar sólo hay que apuntarse al evento (por temas de logística) y llevar un ordenador portátil. El próximo sábado 16 de octubre se hará una Install Party en Linux Center (Valencia). Detrás de Linux Center está Slimbook, una empresa valenciana que ensamblan ordenadores que tienen un buen soporte de GNU/Linux. En total hay 22 plazas y quedan 12 plazas libres en el momento de publicar esta entrada. Si estás interesado puedes usar este enlace del evento.

Agenda de la Install Party

La agenda de la Install Party está divida en dos partes. En la primera, que empieza a las 10:15 y termina a la hora de comer se presentan una serie de charlas relacionadas con el software libre. La segunda parte, que empieza a las 15:30, es la Install Party.

  • 10.15 Què es el Programari Lliure? – Pasqual Guerola i Alex Climent.
  • 12.00 Pausa para el café, té y picoteo, invitados todos los asistentes y pagado por Slimbook.
  • 12.15 Aniversario de KDE, 25 años – Baltasar Ortega.
  • 13.00 Ordenadores con GNU/Linux: Slimbook – Alejandro López
  • 14.00 Comida libre (los asistentes pueden traer bocadillos de casa o pedirse comida para que se la traigan).
  • 15.30 Install Party o taller de instalación de GNU/Linux en vuestros ordenadores.

Exposición de Slimbook

Exposición de Slimbook

Localización y medidas COVID

Una vez os habéis apuntado, el siguiente punto es llegar a Linux Center. Los datos son:

  • Linux Center
  • C/ Ronda de la Química s/n
  • Edificio ABM L’Andana, 7ª planta
  • (Frente a Parque Tecnológico)
  • 46980 Paterna, Valencia

Podéis poner “Linux Center” en Google Maps y os indicará como llegar. En el evento se tendrá gel en la entrada de Linux Center y mascarillas para los que no lleven una propia. Se renovará el aire y el aforo estará más limitado que en otras ocasiones para mantener las medidas de seguridad.

Organizadores

Los organizadores del evento son:

El evento es gratuito y no se retransmitirá por streaming. Si quieres participar, hay que ir físicamente. El cartel el evento lo ha diseñado ESME.

Install Party Linux Center

Install Party Linux Center (ESME)

Conclusiones

Una Install Party es una buena forma de instalar GNU/Linux en un ordenador con ayuda extra. Aunque el proceso es sencillo, si que os recomiendo tener una copia de seguridad de la información importante en un disco externo. De esa forma, si algo sale mal, siempre nos podemos recuperar de un error. Las charlas que dan antes de la Install Party son interesantes y ayudan a conocer más cosas de la comunidad. ¿Os animáis a participar?

Resumen para asistir:

  • Ordenador portátil con ratón y cargador.
  • Memoria USB para pasar la ISO de GNU/Linux.
  • Espacio libre en el disco duro, por ejemplo 25 GB.
  • Copia de seguridad de los datos en un disco externo (recomendable).
  • Ganas de aprender.
  • Pingüino de Tux (opcional).

Nota: si se puede instalar GNU/Linux en un ordenador que tenga Windows 11.

La entrada Install Party el sábado 16 en Linux Center se publicó primero en InnerZaurus.

15 Oct 06:29

Informativo matinal 15:10:21

by Solocomedia

😻😽🔔 Y recuerda que cada vez que te suscribes al canal y activas la campanita, un gatito sonríe y juega feliz con un ovillo de lana. 😻😽🔔
➡️ https://cutt.ly/Tffbse6 ⬅️

Si te aburres, también puedes seguirnos por nuestras redes sociales:
▶️ Instagram: https://www.instagram.com/solocomedia/
▶️ Twitter: https://twitter.com/solocomedia
▶️ Facebook: https://www.facebook.com/solocomedia

Y si quieres saber cosas que pasan con la comedia aquí en España pásate por
www.solocomedia.com

Hay cosas GRATIS.
14 Oct 15:20

Informativo matinal 14:10:21

by Solocomedia

😻😽🔔 Y recuerda que cada vez que te suscribes al canal y activas la campanita, un gatito sonríe y juega feliz con un ovillo de lana. 😻😽🔔
➡️ https://cutt.ly/Tffbse6 ⬅️

Si te aburres, también puedes seguirnos por nuestras redes sociales:
▶️ Instagram: https://www.instagram.com/solocomedia/
▶️ Twitter: https://twitter.com/solocomedia
▶️ Facebook: https://www.facebook.com/solocomedia

Y si quieres saber cosas que pasan con la comedia aquí en España pásate por
www.solocomedia.com

Hay cosas GRATIS.
13 Oct 19:07

Twitch

by danigm

Corre un torrent por ahí con 128GB de cosas de Twitch https://www.theregister.com/2021/10/06/twitch_data_leak/

La entrada Twitch se publicó primero en Linux Hispano.

13 Oct 09:29

Informativo matinal 13:10:21

by Solocomedia

😻😽🔔 Y recuerda que cada vez que te suscribes al canal y activas la campanita, un gatito sonríe y juega feliz con un ovillo de lana. 😻😽🔔
➡️ https://cutt.ly/Tffbse6 ⬅️

Si te aburres, también puedes seguirnos por nuestras redes sociales:
▶️ Instagram: https://www.instagram.com/solocomedia/
▶️ Twitter: https://twitter.com/solocomedia
▶️ Facebook: https://www.facebook.com/solocomedia

Y si quieres saber cosas que pasan con la comedia aquí en España pásate por
www.solocomedia.com

Hay cosas GRATIS.
13 Oct 09:12

Ubuntu Touch Q&A 110

by Blog Team
* * Looking for the Audio-only version * * of the Q&A?  * You're just one big orange button away --> Get the Audio Version [1] ***News and Update *** UBports Q&A 110 on 9 October 2021 Presenting th...
12 Oct 20:27

Trucos para hacer huevos fritos que funcionan (y otros que no) | EL COMIDISTA

by El Comidista en EL PAÍS

"No sabe hacer ni un huevo frito" es una expresión habitual para describir a esas personas que lo ignoran todo de la cocina. Sin embargo, alcanzar la excelencia con este plato no es tan fácil, y el mundo está lleno de huevos fritos reguleros.

Los mandamientos para no fallar con el huevo frito ya te los dimos en nuestra sección Cocina para lerdos, pero desde entonces hemos detectado la presencia de unos cuantos truquis supuestamente milagrosos en YouTube y TikTok. El Comidistest ha pasado por su filtro cinco técnicas: el paquetito de clara con la yema dentro, los huevos a cascoporro en bandeja de horno, el huevo frito con vapor, en molde o en forma de nube cuqui. Varios funcionan, uno está realmente bien y otro es una basura. https://bit.ly/ComiditestHuevosFritos

Suscríbete a nuestro canal: http://cort.as/-9ysp
Visita: https://elcomidista.elpais.com
Síguenos en Facebook: https://www.facebook.com/elcomidista
Síguenos en Twitter: https://twitter.com/ElComidista Síguenos en Instagram:
https://www.instagram.com/elcomidista
12 Oct 20:17

Los engaños de los productos infantiles | EL COMIDISTA

by El Comidista en EL PAÍS

Cierta industria alimentaria vende como beneficiosos productos en absoluto saludables para los niños. ¿Cuáles son las técnicas más habituales para confundir a los padres? https://bit.ly/enganosproductosinfantiles

Suscríbete a nuestro canal: http://cort.as/-9ysp
Visita: https://elcomidista.elpais.com
Síguenos en Facebook: https://www.facebook.com/elcomidista
Síguenos en Twitter: https://twitter.com/ElComidista Síguenos en Instagram: https://www.instagram.com/elcomidista
¡Bienvenido al canal oficial de EL COMIDISTA en EL PAÍS! Cada semana publicamos nuevos vídeos de gastronomía, recetas, restaurantes, productos, chaladuras culinarias y mucho más. ¡Suscríbete ya a nuestro canal!: http://cort.as/-9ysp
El Comidista es una web muy maja que incluye recetas, info sobre trastos de cocina, restaurantes, productos y cualquier tontería que se les ocurra a sus autores.
El Comidista es una web muy maja que incluye recetas, info sobre trastos de cocina, restaurantes, productos y cualquier tontería que se les ocurra a sus autores.

Visita ➜ https://elcomidista.elpais.com/
Síguenos en Facebook ➜ https://www.facebook.com/elcomidista/
Síguenos en Twitter ➜ https://twitter.com/ElComidista
Síguenos en Instagram ➜ https://www.instagram.com/elcomidista
11 Oct 20:58

Curry verde tailandés de ternera | EL COMIDISTA

by El Comidista en EL PAÍS

Aunque la palabra "curry" se suele asociar a "comida india", este plato tiene un importante arraigo en otros lugares de Asia. Japón es uno de ellos,
pero si existe un país que pueda plantar cara a la India y Pakistán en
variedad y excelencia, es Tailandia. Los currys verdes, rojos o
amarillos, populares ya en medio mundo gracias a los restaurantes thai, son sólo la punta del iceberg de una cultura gastronómica exhuberante en este tipo de preparaciones.
Los
currys tailandeses son más frescos y herbáceos que los indios. Pueden
picar como un demonio, pero tienen la ventaja de que son muy rápidos de
hacer. Así lo demuestra el curry verde que nos preparó Alejandro
Zurdo, autor de Comiendo en las calles de Asia, en el
restaurante Kitchen 154 de Madrid. Él usó ternera y boniato, pero su
fórmula vale para cualquier tipo de hortaliza, carne o pescado. Todo lo
tienes en el vídeo de arriba.
RECETA ESCRITA: https://bit.ly/CurryVerdeTailandes

Suscríbete a nuestro canal: http://cort.as/-9ysp
Visita: https://elcomidista.elpais.com
Síguenos en Facebook: https://www.facebook.com/elcomidista
Síguenos en Twitter: https://twitter.com/ElComidista
Síguenos en Instagram: https://www.instagram.com/elcomidista
¡Bienvenido al canal oficial de EL COMIDISTA en EL PAÍS! Cada semana publicamos nuevos vídeos de gastronomía, recetas, restaurantes, productos, chaladuras culinarias y mucho más. ¡Suscríbete ya a nuestro canal!: http://cort.as/-9ysp
El Comidista es una web muy maja que incluye recetas, info sobre trastos de cocina, restaurantes, productos y cualquier tontería que se les ocurra a sus autores.
11 Oct 20:47

🔴 NO PODRÁS CREER LO QUE HE HECHO CON MATERIALES ELECTRÓNICOS

by LlegaExperimentos

NO PODRÁS CREER LO QUE HE HECHO CON MATERIALES ELECTRÓNICOS
👉 5 PCB´s por $2 (Color purpura o cualquier otro): https://jlcpcb.com/DYE
👉 Esquema Amplificador: http://bit.ly/2Dy4JFy
👉 Tienda Online Componentes Electrónicos: https://lcsc.com/

Música utilizada:
Track: Andromedik - With Me [NCS Release]
Music provided by NoCopyrightSounds.
Watch: https://youtu.be/pyj9yJO4rbA
Free Download / Stream: http://ncs.io/WithMeYO
09 Oct 20:27

🔵 ELECTRICIDAD GRATIS #shorts

by LlegaExperimentos
08 Oct 17:53

B.U.G.S. núm. 63 – “Creencias”

by Pedro Pérez Gómez

La entrada B.U.G.S. núm. 63 – “Creencias” se publicó primero en Linux Hispano.

08 Oct 06:55

Informativo matinal 08:10:21

by Solocomedia

😻😽🔔 Y recuerda que cada vez que te suscribes al canal y activas la campanita, un gatito sonríe y juega feliz con un ovillo de lana. 😻😽🔔
➡️ https://cutt.ly/Tffbse6 ⬅️

Si te aburres, también puedes seguirnos por nuestras redes sociales:
▶️ Instagram: https://www.instagram.com/solocomedia/
▶️ Twitter: https://twitter.com/solocomedia
▶️ Facebook: https://www.facebook.com/solocomedia

Y si quieres saber cosas que pasan con la comedia aquí en España pásate por
www.solocomedia.com

Hay cosas GRATIS.
07 Oct 17:11

Monitoriza los procesos en Linux

by victorhck

Veamos algunos comandos para monitorizar los procesos que eventos que crea el kernel linux en nuestro sistema

Las herramientas para la línea de comandos más comunes en nuestras distribuciones GNU/Linux para tener un control de los procesos del sistema son ps, pstree, pidof o pgrep que forman parte del conjunto de herramientas procps-ng (que incluye alguna otra herramienta como free o watch).

Los procesos son eventos que son gestionados por el kernel del sistema, en este caso Linux. Los procesos son creados cuando lanzas una aplicación o se ejecutan en segundo plano para mantener la hora del sistema, monitorizar el sistema de archivos.

A cada proceso del sistema se le asigna un número o identificador también conocido como IP o PID, que será la manera de gestionar dicho proceso, parándolo, matándolo, conocer quién lo creó, etc.

Estas herramientas pueden ser muy útiles a la hora de gestionar procesos de aplicaciones que se quedan colgadas, o se “vuelven locas” haciendo que el sistema falle.

Este artículo es una traducción/adaptación del artículo en inglés escrito por Seth Kenlon para la web opensource.com y publicado bajo una licencia CC-by-sa.

Ya vimos en el blog unas cuantas herramientas externas para monitorizar tu sistema de una forma más gráfica desde la línea de comandos:

Pero con las herramientas que ofrece procps-ng, podremos ir más al detalle, encontrando el identificador de un proceso, ya sabes el ID o PID. Para ello tenemos herramientas como ps, pstree, pidof o pgrep.

Encontrar el PID de un programa en ejecución

En la ocasión en la que quieras saber cual es el identificador del proceso ID o PID de una aplicación específica que sabes que se está ejecutando, puedes utilizar pidof o pgrep para encontrar esos procesos.

El comando pidof devuelve los PID de un comando, buscando por el nombre exacto. Como yo utilizo zsh, puedo saber los PID que este ha creado mediante:

$pidof zsh
4039 4038 4011 4005

El comando pgrep permite la búsqueda con expresiones regulares. Por ejemplo al buscar con pidof x11 no encuentra nada, porque hay que proporcionarle el nombre exacto.

Pero una búsqueda con pgrep que contenga la cadena x11 sí nos proporciona resultados:

pgrep .x11                                                                                     
1242
1381
1723

Obtener el nombre del proceso por el PID

Si conces el PID de un proceso, pero no sabes qué comando ha lanzado ese proceso, puedes realizar una “búsqueda inversa” mediante el comando ps:

ps 4011
PID TTY STAT TIME COMMAND
4011 pts/0 S 0:00 /bin/zsh

Listar todos los procesos

El comando ps muestra un listado de los procesos. Puedes verlos todos con la opción -e. Pero si solo quieres ver los creados por tu usuario (o el usuario que desees) puedes hacerlo con la opción -U <nombre>.

ps -U victorhck

Pero mejor que este comando, quizás es pstree, que nos muestra la salida de los procesos, pero en forma de árbol viendo qué proceso fue creado por quién, etc. Además también podemos hacer que nos muestre el número del proceso:

pstree -U victorhck --show-pids

Matando un proceso

Ahora que ya sabemos cómo conseguir el PID de un proceso, podremos “matarlo” para acabar con él, si este está creando conflictos en nuestro sistema y no responde a otras formas de acabar con el.

Por ejemplo si queremos matar un proceso, simplemente escribiremos:

kill <número_PID>

Y esto sería suficiente para terminarlo instantáneamente.


Espero que te haya resultado útil el artículo. ¿Ya conocías estos comandos? ¿Los utilizabas? ¿uilizas otros? Utiliza los comentarios para compartir tus experiencias y opiniones.