Publi

Magia en Bash 50 ejemplos en una sola linea (o dos)

Bash es una de las herramientas más potentes que tenemos a nuestro alcance, aunque no sólo de bash trata el artículo, sino de trucos para consola, one-liner como dirían muchos (aunque habrá algunos two-liners) que podemos utilizar y pueden hacernos la vida un poco más fácil:

Tabla de contenidos

Cadenas de texto

Trim

Es una herramienta que utilizaremos para recortar nuestra cadena basándonos en los a la ìzquierda y a la derecha, en este caso nos basaremos en los espacios, que es uno de sus usos más comunes (así podemos obtener la cadena limpia tanto por delante como por detrás. Podemos ver un ejemplo en C aquí; aunque en la terminal muchas veces es útil, y sobre todo para nuestros scripts.

1
2
CADENA="   Esto es una cadena   ";
echo ["${CADENA#"${CADENA%%[![:space:]]*}"}"]

Donde sólo recortamos a la izquierda:

[Esto es una cadena ]

1
2
CADENA="   Esto es una cadena   ";
echo ["${CADENA%"${CADENA##*[![:space:]]}"}"]

Donde sólo recortamos a la derecha:

Esto es una cadena

Si queremos recortar a los dos lados, podemos ejecutar los dos, podemos juntar las dos instrucciones anteriores:

1
2
3
4
CADENA="   Esto es una cadena   ";
CADENA="${CADENA#"${CADENA%%[![:space:]]*}"}"
CADENA="
${CADENA%"${CADENA##*[![:space:]]}"}"
echo $CADENA

O si queremos acudir a sed:

1
2
3
4
CADENA="   Esto es una cadena   ";
echo $CADENA | sed 's/\s*\(.*\)\s*/\1/g'
# Forma antigua en el post
#echo $CADENA | sed 's/^\s\(.*\)\s\$/\1/g'

La nueva expresión con sed me ha dado mejores resultados en algunas cadenas resultantes de la ejecución de algunos comandos. Dejo la antigua para referencia.

Calendarios

Si queremos un calendario de 2030:

cal 2030
2030
Enero                Febrero                Marzo
do lu ma mi ju vi sá  do lu ma mi ju vi sá  do lu ma mi ju vi sá
1  2  3  4  5                  1  2                  1  2
6  7  8  9 10 11 12   3  4  5  6  7  8  9   3  4  5  6  7  8  9
13 14 15 16 17 18 19  10 11 12 13 14 15 16  10 11 12 13 14 15 16
20 21 22 23 24 25 26  17 18 19 20 21 22 23  17 18 19 20 21 22 23
27 28 29 30 31        24 25 26 27 28        24 25 26 27 28 29 30
31
Abril                  Mayo                 Junio
do lu ma mi ju vi sá  do lu ma mi ju vi sá  do lu ma mi ju vi sá
1  2  3  4  5  6            1  2  3  4                     1
7  8  9 10 11 12 13   5  6  7  8  9 10 11   2  3  4  5  6  7  8
14 15 16 17 18 19 20  12 13 14 15 16 17 18   9 10 11 12 13 14 15
21 22 23 24 25 26 27  19 20 21 22 23 24 25  16 17 18 19 20 21 22
28 29 30              26 27 28 29 30 31     23 24 25 26 27 28 29
30
Julio                 Agosto              Septiembre
do lu ma mi ju vi sá  do lu ma mi ju vi sá  do lu ma mi ju vi sá
1  2  3  4  5  6               1  2  3   1  2  3  4  5  6  7
7  8  9 10 11 12 13   4  5  6  7  8  9 10   8  9 10 11 12 13 14
14 15 16 17 18 19 20  11 12 13 14 15 16 17  15 16 17 18 19 20 21
21 22 23 24 25 26 27  18 19 20 21 22 23 24  22 23 24 25 26 27 28
28 29 30 31           25 26 27 28 29 30 31  29 30
Octubre              Noviembre             Diciembre
do lu ma mi ju vi sá  do lu ma mi ju vi sá  do lu ma mi ju vi sá
1  2  3  4  5                  1  2   1  2  3  4  5  6  7
6  7  8  9 10 11 12   3  4  5  6  7  8  9   8  9 10 11 12 13 14
13 14 15 16 17 18 19  10 11 12 13 14 15 16  15 16 17 18 19 20 21
20 21 22 23 24 25 26  17 18 19 20 21 22 23  22 23 24 25 26 27 28
27 28 29 30 31        24 25 26 27 28 29 30  29 30 31

Si queremos un calendario de Febrero de 2050

cal 2 2050
Febrero 2050
do lu ma mi ju vi sá
1  2  3  4  5
6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28

Contar palabras

Contar las palabras que salen en un texto diciendo cuántas veces sale cada una (el texto es FICHERO.txt):

tr -c a-zA-Z ‘\n’ < FICHERO.txt  | sed ‘/^$/d’ | sort | uniq -i -c | sort -n
2 habitaci
2 las
2 le
2 me
2 muy
2 normal
2 numerosas
2 patas
2 pieles
2 por
2 Qu
2 s
2 Samsa
2 ten
3 Gregorio
3 hasta
4 estaba
4 su
5 sobre
6 en
6 no
6 se
7 el
7 una
8 la
8 n
10 que
10 un
10 y
11 a
16 de

El primer comando (tr) pone una palabra en cada línea, sed, elimina las líneas vacías, el primer sort ordena las palabras, poniendo las palabras repetidas todas juntas, uniq pone sólo una vez cada palabra, y dice cuántas veces se repiten (porque están juntas), el último sort ordena las palabras por número de apariciones.
Si queremos que se contabilicen tildes, eñes y otros símbolos, probad

tr -c a-zA-Zá-úñ ‘\n’ < FICHERO.txt | sed ‘/^$/d’ | sort | uniq -i -c | sort -n
2 habitación
2 las
2 le
2 me
2 muy
2 normal
2 numerosas
2 patas
2 pieles
2 por
2 Samsa
2 tenía
3 a
3 Gregorio
3 hasta
4 estaba
4 su
5 sobre
6 en
6 no
6 se
7 el
7 una
8 la
9 y
10 que
10 un
16 de

Podemos pasarle a tr los caracteres que necesitemos. Podemos ver que las vocales con tilde y ñ salen en este nuevo listado. Gracias nauta.

Extraer información de las columnas de la entrada

Muy útil si tenemos una información en columnas y queremos cambiar el orden de las mismas:

1
2
col() { awk '{print $('$(echo $* | sed -e s/-/NF-/g -e 's/ /),$(/g')')}'; }
echo "AAA BBB CCC" | col 1 3 -1 -2

Esto devolverá

AAA CCC BBB AAA

Introducir en nuestro editor lo que estamos escribiendo

Escribimos una línea en la consola, ahora pulsamos Control X, Control E y automáticamente aparecerá esa línea en nuestro editor por defecto. Para configurar nuestro editor (por ejemplo a nano):

export EDITOR=nano

Poner una cadena en mayúsculas o minúsculas

Podemos hacerlo fácilmente con tr:

echo ‘hola Mundo’ | tr ‘[:lower:]’ ‘[:upper:]’
HOLA MUNDO

y para pasar a minúsculas:
echo ‘hola Mundo’ | tr ‘[:upper:]’ ‘[:lower:]’
hola mundo

podemos usar awk:
echo «hola mundo» | awk ‘{print toupper($0)}’
HOLA MUNDO

o para minúsculas
echo «HOLA MUNDO» | awk ‘{print tolower($0)}’
hola mundo

podemos usar perl:
echo «hola mundo» | perl -e ‘print uc <>;’
HOLA MUNDO

o para minúsculas
echo «HOLA MUNDO» | perl -e ‘print lc <>;’
hola mundo

o desde el mismo bash de la siguiente forma:
1
2
3
4
5
6
7
;A mayúsculas...
TEXTO="Hola Mundo"
echo "${TEXTO^^}"

;Ay minúsculas...
TEXTO="hOLA mUNDO"
echo "${TEXTO,,}"

Información y mantenimiento del sistema

Sobre los slots de RAM en nuestro equipo

Para ver esta información necesitamos privilegios de root

dmidecode -t memory
dmidecode 3.0
Getting SMBIOS data from sysfs.
SMBIOS 3.0.0 present.
Handle 0x0016, DMI type 16, 23 bytes
Physical Memory Array
Location: System Board Or Motherboard
Use: System Memory
Error Correction Type: None
Maximum Capacity: 64 GB
Error Information Handle: Not Provided
Number Of Devices: 4
Handle 0x0017, DMI type 17, 40 bytes
Memory Device
Array Handle: 0x0016
Error Information Handle: Not Provided
Total Width: 64 bits
Data Width: 64 bits
Size: 8192 MB
Form Factor: SODIMM
Set: None
Locator: ChannelA-DIMM0
Bank Locator: BANK 0
Type: DDR4
Type Detail: Synchronous
Speed: 2133 MHz
Manufacturer: SK Hynix
Serial Number: 36231321
Asset Tag: 9876543210
Part Number: HMA41GS6AFR8N-TF
Rank: 2
Configured Clock Speed: 2133 MHz
Minimum Voltage: Unknown
Maximum Voltage: Unknown
Configured Voltage: 1.2 V

Si tenemos disponible sudo, podemos hacer
sudo dmidecode -t memory

Espacio libre y ocupado en disco

Con esto vemos el espacio libre en un formato que podemos entender (megabytes, gigabytes…)

df -h
S.ficheros     Tamaño Usados  Disp Uso% Montado en
udev             7,8G      0  7,8G   0% /dev
tmpfs            1,6G   158M  1,5G  10% /run
/dev/sdb2        8,2G   2,6G  5,2G  34% /
/dev/sdb3         13G   8,2G  3,9G  68% /usr
tmpfs            7,8G   640M  7,2G   9% /dev/shm
tmpfs            5,0M   4,0K  5,0M   1% /run/lock
tmpfs            7,8G      0  7,8G   0% /sys/fs/cgroup
/dev/sdb4        7,3G   3,0G  3,9G  44% /var
/dev/sdb6        185G   156G   20G  90% /home
/dev/sdb1        188M   3,5M  184M   2% /boot/efi
cgmfs            100K      0  100K   0% /run/cgmanager/fs
tmpfs            1,6G      0  1,6G   0% /run/user/121
tmpfs            1,6G    80K  1,6G   1% /run/user/1000
fuse-zip          20G      0   20G   0% /mnt/notas

Conocer el UUID de los discos

Si queremos conocer el identificador único de nuestros discos duros, pendrives o demás dispositivos de almacenamiento, podemos hacer (como root, o con sudo delante):

sudo blkid
/dev/sdb1: UUID=»6456-DAE8″ TYPE=»vfat» PARTUUID=»04ba513a-a11d-41e7-9135-fb0e452d9ad4″
/dev/sdb2: UUID=»5e5353b7-6002-49fe-8317-dc93582a80cc» TYPE=»ext4″ PARTUUID=»e53e02d7-95c0-45e6-b944-6a1adb947a29″
/dev/sdb3: UUID=»b8fcf1fa-862c-4a96-93e6-2dde62915b33″ TYPE=»ext4″ PARTUUID=»d31a947a-86c8-4433-9832-a718bcd48477″
/dev/sdb4: UUID=»0c524f04-595b-48f7-aa63-e65989322d9b» TYPE=»ext4″ PARTUUID=»5d88ba29-78e6-4706-860a-e0643083b96a»
/dev/sdb5: UUID=»8a4576e9-65ec-41e9-a9ff-0c651931c5fa» TYPE=»swap» PARTUUID=»c0e5ad84-17ef-4e93-b4cf-703fe97cdd82″
/dev/sdb6: UUID=»01f1ad1e-714b-4888-98f4-b54bffed0d93″ TYPE=»ext4″ PARTUUID=»1ed2a046-e7f7-4078-aa5c-52e01041fccc»
/dev/sdc1: LABEL=»Oregano» UUID=»ff433cbb-830a-4ac0-9d9e-e1671c06acbc» TYPE=»ext4″ PARTUUID=»e0d96c01-01″

Si queremos conocer el UUID de un dispositivo en particular, por ejemplo sdc2 podemos hacer:
sudo blkid /dev/sdc1
/dev/sdc1: LABEL=»Oregano» UUID=»ff433cbb-830a-4ac0-9d9e-e1671c06acbc» TYPE=»ext4″ PARTUUID=»e0d96c01-01″

Los 10 procesos que más CPU utilizan

ps -eo user,%cpu,%mem,rsz,args,pid,lstart|sort -rnk2|awk ‘BEGIN {printf «%12s\t%s\t%s\t%s\t%s\n»,»USER»,»%CPU»,»%MEM»,»RSZ»,»COMMAND»,»PID»,»Started»}{printf «%12s\t%g’%’\t%g’%’\t%d MB\t%s\n»,$1,$2,$3,$4/1024,$5}’|head -n10
USER %CPU %MEM RSZ COMMAND
gaspy 30.3% 16.6% 2650 MB /usr/lib/firefox/firefox
gaspy 10.9% 1.2% 196 MB /usr/lib/chromium-browser/c
gaspy 4.6% 4.4% 704 MB /usr/lib/slack/slack
root 4.1% 2.5% 413 MB /usr/lib/xorg/Xorg
gaspy 3% 4.1% 661 MB /usr/lib/virtualbox/Virtual
gaspy 2.7% 1.6% 261 MB /usr/share/spotify/spotify
gaspy 2.7% 0% 14 MB /usr/bin/pulseaudio
gaspy 2.5% 0.6% 98 MB skype
gaspy 2.4% 2.2% 364 MB /usr/lib/libreoffice/progra

Borrar cachés

Hay que ejecutar como root lo siguiente, veremos algo de RAM libre

echo 3 > /proc/sys/vm/drop_caches

Si no somos root o nos da pereza, ya que no podemos poner sudo delante:
echo 3 | sudo tee /proc/sys/vm/drop_caches

Conocer todos los usuarios del sistema

cat /etc/passwd | sort | cut -d»:» -f1
avahi-autoipd
avahi
backup
bin
colord
daemon
dnsmasq
games
gaspy
gnats
hplip
….

Conocer la cantidad de Swap utilizada

free | grep Swap | awk ‘{printf «Swap Used: %.2f%\n»,$3*100/$2}’
Swap Used: 6.36%

Ejecución de órdenes

Tiempo y recursos utilizados al ejecutar un programa

Para ver el tiempo utilizado en la ejecución de un comando, podemos utilizar:

time [COMANDO]

por ejemplo:
time lsof
bash      32738                     gaspy    0u      CHR             136,35        0t0         38 /dev/pts/35
bash      32738                     gaspy    1u      CHR             136,35        0t0         38 /dev/pts/35
bash      32738                     gaspy    2u      CHR             136,35        0t0         38 /dev/pts/35
bash      32738                     gaspy  255u      CHR             136,35        0t0         38 /dev/pts/35
real 2m11.895s
user 0m6.756s
sys 0m6.628s

Para saber los archivos abiertos en este momento, y ver el tiempo empleado en obtener esa información.
Si queremos más información podemos hacer:
/usr/bin/time -f ‘rss=%Mk etime=%E user=%U sys=%S in=%I out=%O’ lsof

Con lo que nos dirá la memoria empleada el tiempo de usuario, sistema y el número de entradas y salidas en el sistema de archivos. ¡Ojo! Bash tiene una implementación de time diferente a /usr/bin/time , por eso hay que poner la ruta completa.

Obtener el último comando utilizado

Lo podemos hacer poniendo !!:

echo «HOLA MUNDO CRUEL»
HOLA MUNDO CRUEL
!!
echo «HOLA MUNDO CRUEL»
HOLA MUNDO CRUEL

Eso puede tener muchas utilidades, por ejemplo, cuando queremos ejecutar el último comando ejecutado con sudo delante:
ls /root/
ls: no se puede abrir el directorio ‘/root/’: Permiso denegado
sudo !!
sudo ls /root/
[sudo] password for gaspy:
archivo    Documentos  Imágenes  Plantillas  Vídeos
Descargas  Escritorio  Música  Público

O si queremos escribir el último comando (una línea muy larga, por ejemplo) en un fichero:
echo «!!» > fichero
echo «sudo ls /root/» > fichero
cat fichero
sudo ls /root/

O introducir el resultado de la última ejecución en una variable:
VARIABLE=`!!`

Cambiar una parte de la ejecución anterior

Imaginemos que hemos escrito una línea muy larga y nos hemos equivocado en una pequeña parte, actualmente usamos casi siempre entorno gráfico y copiamos, pegamos y listo, pero hay otra forma más geek:

echo «Eres un admin muy feo»
Eres un admin muy feo
^feo^guapo
echo «Eres un admin muy guapo»
Eres un admin muy guapo

Seguro que veis la idea.

Insertar el último argumento anterior

Es como antes, ahora con el copia y pega se pierden las buenas técnicas. Para eso tenemos que pulsar (ALT+.) Alt y la tecla punto:

ls Descargas/Programas/Temas/Thunderbird
cd [ALT+.]

Ejecutar un comando a una hora determinada

Para ello podemos hacer:

echo «mplayer Musica/Cancion.mp3» | at 19:20

Para reproducir música a las 19:20 o
echo «mplayer Musica/Cancion.mp3» | at now + 30min

para ejecutarlo dentro de media hora.
echo «mplayer Musica/Cancion.mp3» | at tomorrow

para ejecutarlo mañana.

Navegación por directorios

Volver al directorio de usuario

Podemos hacerlo de dos formas:

cd

o
cd ~

Ir al home de un usuario concreto

cd ~usuario

Ir al directorio anterior

Con este comando si cambiamos de directorio por un momento, luego podemos volver donde estábamos

cd --

Ir a un directorio y almacenarlo en un historial

Con este comando nos dirigiremos a otro directorio, pero almacenaremos un historial de directorios visitados (y luego podremos volver)

pushd ~/Descargas
~/Descargas

Volver al último directorio que tenemos en el historial

popd

Ejecutar un script local en un servidor remoto

ssh usuario@servidor bash < /ruta/del/script/local.sh

Ejecutar un comando en segundo plano, y poder ver el estado en cualquier momento

screen -d -m -S MiPing ping google.com

Cuando queramos ver el estado, hacemos
screen -R MiPing

Dentro de esa ventana, podemos pulsar Control C para cerrar el programa o Control A Control Z para seguir en segundo plano.

Archivos

Montar un disco RAM

Necesitamos un disco RAM para algo rápido… unos 100Mb (como root):

mkdir /mnt/tmp
mount -t tmpfs tmpfs /mnt/tmp -o size=100m

Pero todo lo que guardemos se perderá cuando reiniciemos el ordenador o cuando hagamos:
umount /mnt/tmp

Crear un archivo con información aleatoria

Con esto, creamos un fichero de 1Mb (1K*1024)

dd if=/dev/urandom of=test count=1024 bs=1K

Listar archivos (ls)

Ver los archivos del directorio actual (incluyendo ocultos, en modo lista, ordenador por fecha de forma ascendente y los tamaños en formato humano

ls -latrh

Ver los archivos del directorio actual (incluyendo ocultos, en modo lista, ordenador por tamaño de forma descendente y los tamaños en formato humano
ls -laSh

Buscar archivos (find)

Buscar todos los archivos que contengan playa y terminen en jpg (sin distinguir mayúsculas de minúsculas que tengan menos de 2 semanas (14 días)

find . -mtime -14 -iname ‘*playa*jpg’

Borrar archivos log con más de 30 días:
find . -name ‘*.log’ -mtime +30 -type f -exec rm {} \;

Montar un fichero .iso (como root)

mkdir /mnt/cdvirtual
mount -t iso9660 -o loop file.iso /mnt/cdvirtual

Si el ISO está en formato UDF (si contiene ficheros de más de 2Gb), poner udf en lugar de iso9660

Conocer los archivos más pesados

Para ver el TOP 3 de los archivos más pesados en el directorio actual y subdirectorios:

find -printf «%s\t%P\n» | sort -r -n | head -n 3

Cambiar el orden de una secuencia de archivos

Tenemos archivos secuencia0001.png a secuencia0124.png y queremos invertir el orden de la secuencia, ahora serán secuenciaB…

for i in {1..124};  do    cp $(printf «secuencia%04d.png» $i) $(printf «secuenciaB%04d.png» $((125-$i))) ;  done

Es importante ver que al principio está el 124 como último número, y al final la operación es 125-$i (esto es porque empezamos en 0001). Es recomendable no llamar igual a la secuencia, o si no, en lugar de cp, podemos usar mv.

Cambiar la extensión de un archivo

mv archivo.{actual,nueva}

Copiar determinados capítulos de una serie

Por ejemplo, de la primera temporada, del 5 al 14, los copiamos al directorio /mnt/compartido

cp Serie1x{05..14}* /mnt/compartido

Detectar archivos duplicados

Si ejecutamos esto en el directorio actual se buscarán ficheros en todos los subdirectorios.

find -not -empty -type f -printf «%s\n» | sort -rn | uniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate

Buscar un texto en todos los arhivos de una carpeta y subcarpetas

egrep -R ‘CADENA’ *

Descomprimir todos los tar.bz2 del directorio actual

for ARCHIVO in *; do tar -xvjf $ARCHIVO; done

Grabar un DVD con los contenidos de un directorio

Cuidado con sobrepasar el tamaño del DVD

growisofs -dvd-compat -Z /dev/scd0 -R -J -pad /directorio/a/grabar

Red

Puerto y PID que lo usa

Para los puertos TCP:

netstat -tnp

Para los puertos UDP:
netstat -unp

Para ver los puertos que hay escuchando, pondremos también un -l.

Conocer nuestra IP externa

curl ifconfig.me

o
curl http://checkip.dyndns.org/

Un servidor web sencillo en el directorio actual

Este comando iniciará un servidor web en el puerto 8000

python -m SimpleHTTPServer

Si queremos especificar el puerto:
python -m SimpleHTTPServer 9000

Avisarme cuando un servidor vuelva a estar activo

Sólo vale si google.com se cae, pero si se cae uno de nuestros servidores podemos poner un aviso para que nos avise cuando vuelva a verse el servidor. También vale si nosotros nos caemos y queremos ver cuánto ha durado un corte de conexión de nuestro operador.

while ! ping -c1 google.com; do sleep 1; done && echo «El servidor ha vuelto: «`date` | zenity --text-info

Conocer la IP de nuestro dispositivo de red

Si no nos vale con poner ifconfig y tener toda la información, podemos hacer:

LANG=C; ifconfig wlan0 | perl -n -e ‘if (m/inet addr:([\d\.]+)/g) { print $1 }’
192.168.0.3

Cálculo

Hacer una cuenta

Podemos pasar a bc las operaciones que queremos realizar:

echo «1+4+6*9+9*10+34-25/2» | bc
171

Si la operación devuelve decimales (un máximo de 3):
echo «scale=3; 7863/2398» | bc
3.278

Si queremos hacer cálculos con senos y cosenos. Seno de pi/2:
echo «scale=2; s(3.141592/2)» | bc -l
1.00

Calcular pi con 100 decimales:
echo «scale=100; 4*a(1)» | bc -l
3.141592653589793238462643383279502884197169399375105820974944592307\
8164062862089986280348253421170676

Operaciones sencillas

Sólo operaciones sencillas (sumas, restas, multiplicaciones y divisiones) enteras. Es más rápido que bc

let VARIABLE=1+2+3+4*5
echo $VARIABLE
26

También lo podemos hacer con versiones nuevas de BASH así:
echo $((4+5+3*4-4/2))
19

O utilizando expr (aunque tenemos que poner un espacio entre cada elemento)
expr 2 + 3 + 4 \* 5 / 2
15

Cambios de base

De decimal a octal (120 es el decimal)

printf «%o» 120
170

De decimal a hexadecimal
printf «%X» 125
7D

o (si queremos la letra en minúscula)
printf «%x» 120
7d

De base A (hasta 16) a base B (hasta la que queramos)
echo «ibase=A; obase=B; N» | bc

por ejemplo, para pasar de hexadecimal a binario:
echo «ibase=16; obase=2; FF» | bc
11111111

o para pasar de binario a decimal:
echo «ibase=2; 11011101» | bc
221

Generar una secuencia de números

Generar una secuencia del 1 al 100:

seq 1 100
1
2
3
4
….
98
99
100

Generar una secuencia del -50 al 50
echo {-50..50}
-50 -49 -48 -47 -46 -45 -44 -43 -42 -41 -40 -39 -38 -37 -36 -35 -34 -33 -32 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

Otros

Separar en varios archivos un archivo VCF con muchos contactos

1
2
3
4
5
Esto es útil si quieres pasar tus contactos de Android a Symbian (para un móvil antiguo , por ejemplo)
for i in `grep -n '^BEGIN:VCARD' "Archivo.VCF" | cut -d ':' -f 1`; do
  j=`tail -n "+$i" "$VCFILE" | grep -ne '^END:VCARD' -m 1 | cut -d ':' -f 1`
  tail -n "+$i" "$VCFILE" | head -n "$j" > "$i.vcf"
done

Separar en varios archivos un archivo VCS con muchos calendarios

1
2
3
4
for i in `grep -n '^BEGIN:VTODO' "Archivo.VCS" | cut -d ':' -f 1`; do
  j=`tail -n "+$i" "$VCFILE" | grep -ne '^END:VTODO' -m 1 | cut -d ':' -f 1`
  ( echo 'BEGIN:VCALENDAR' ; echo 'VERSION:1.0' ; tail -n "+$i" "$VCFILE" | head -n "$j" ; echo 'END:VCALENDAR' ) > "$i.vcs"
done

Listar todas las tablas de una base de datos MySQL

mysql -pPASSWORD -uUSUARIO -e ‘use BASE; show tables;’ | while read i; do echo $i; done

Referencias

Muchos son míos, otros han sido vistos en varios sitios hace tiempo, y otros son clásicos, que están en muchos sitios. Pero aquí mencionaré algunas fuentes (en algunas podréis encontrar más ejemplos y otros one-liners que no he incluído en la lista):
Bash One-Liners
Just another tech blog
Good coders code, great reuse
Al pan pan y al vino vino
All about Symbian Forums
Fusion242

Actualizaciones

Actualizado el 22/04/2013, añadida una solución para contar palabras con símbolos y eñes.
Actualizado el 04/02/2015, modificado el trim con sed. Ahora funciona mejor (el antiguo daba problemas con algunas cadenas de caracteres)
Actualizado el 25/10/2015, corregidos unos caracteres que no salían bien y descolocaban parte del texto en Contar palabras.
Actualizado el 07/07/2016, corregido un < que no se visualizaba en una parte del post.
Actualizado el 04/11/2016, ahora los ejemplos utilizan el plugin SimTerm para ser más visuales.
Actualizado el 07/09/2017, por un bug en WordPress, una consola no se veía bien. Arreglado.

También podría interesarte....

There are 5 comments left Ir a comentario

  1. Pingback: Bitacoras.com /

  2. nauta /
    Usando Mozilla Firefox Mozilla Firefox 19.0 en Linux Linux

    Hola totaki
    en CONTAR PALABRAS
    si puedes ayudar hay un problema: que las palabras que tienen tildes y ñ las separa. por ej mayúsculas o cumpleañero sale así:

    5 cumplea
    5 ero
    7 may
    7 sculas

    ¿cómo hago para que no me separe las palabras con tildes, ñ, diéresis ?
    ¿cómo hago para que quede ordenado así:
    cumpleañero 5
    mayúsculas 7
    ?
    saludo

    1. admin / Post Author
      Usando Mozilla Firefox Mozilla Firefox 20.0 en Ubuntu Linux Ubuntu Linux

      Se lo tenemos que decir también a tr. Prueba con:
      $ tr -c a-zA-Zá-úñ ‘\n’ < contar | sed '/^$/d' | sort | uniq -i -c | sort -ntendremos que añadir todos los símbolos que queramos que cuente en las palabras.Muchas gracias por tu comentario.

  3. Pingback: 19 Cosas chulas que podemos hacer con la terminal de Linux /

  4. Brown Sunny /
    Usando Google Chrome Google Chrome 121.0.0.0 en Windows Windows NT

    Objective:
    The objective of suika game is to score points by creating larger fruits through combining fruits of the same type.

Leave a Reply to admin Cancle Reply