Herramientas de Linux
Introducción
Este capítulo presenta una serie de herramientas de Linux que todo usuario debería conocer. A menudo basta con una línea de comandos adecuada para efectuar los mismos tratamientos que un centenar de clics de ratón con un administrador de archivos gráfico.
Al finalizar este capítulo el lector sabrá, entre otras cosas:
-
buscar archivos según ciertos criterios y aplicarles un tratamiento;
-
filtrar el contenido de archivos y las salidas de comandos con expresiones regulares;
-
ordenar y separar datos;
-
ver parcialmente el contenido de archivos.
find
El comando find permite buscar, en uno o más árboles de directorios, archivos que respondan a ciertos criterios y aplicarles un tratamiento según una acción determinada.
La sintaxis global del comando es:
find ruta(s) parámetro(s) acción
La sintaxis del comando find no sigue las reglas elementales de sintaxis de los comandos de Linux descritos en el capítulo Inicio de sesión y primeros comandos.
1. Ruta de búsqueda
Se especifica en el comando find una o más rutas de búsqueda; estas rutas son directorios del sistema de archivos y find se encarga de recorrer todo el árbol subyacente en busca de archivos.
Si no se especifica una ruta, find inicia su búsqueda en el directorio actual:
$ ls -R
.:
archivo1 archivo2 dir1 dir2
./dir1:
./dir2:
$ find
.
./dir2
./dir1
./archivo2
./archivo1
$ find .
.
./dir2
./dir1
./archivo2
./archivo1
Cuando se especifican varias rutas, se separan con espacios:
$ find /var/spool/mail . /etc/skel
/var/spool/mail
/var/spool/mail/alan
/var/spool/mail/linus
/var/spool/mail/richard
/var/spool/mail/gordon
/var/spool/mail/eric
/var/spool/mail/rpc
/var/spool/mail/ken
/var/spool/mail/dennis
/var/spool/mail/javier
.
./dir2
./dir1
./archivo2
./archivo1
/etc/skel
/etc/skel/.gnome2
/etc/skel/.bashrc
/etc/skel/.bash_logout
/etc/skel/.mozilla
/etc/skel/.mozilla/plugins
/etc/skel/.mozilla/extensions
/etc/skel/.bash_profile
2. Expresiones de selección
Los criterios de selección, o expresiones, empiezan con un - (guión) seguido por sus parámetros.
Por ejemplo, la expresión -name nomarc pide al comando find que busque sólo los archivos cuyo nombre sea nomarc. La línea de comando completa, para una búsqueda en todo el árbol de Linux, es:
find / -name nomarc 2>/dev/null
Un usuario normal no tiene los permisos suficientes para acceder a todos los archivos presentes en el sistema. Como por lo general sólo se buscan los archivos a los que se puede acceder, habitualmente se suprimen los mensajes de error del comando find debidos a esta falta de permiso de acceso, redirigiendo la salida de errores estándar al archivo...
grep
El comando grep permite buscar en uno o más archivos, o en la entrada estándar, las líneas correspondientes a un filtro.
La sintaxis general de grep es:
grep opción(es) filtro archivo(s)
Al utilizar la entrada estándar para filtrar la salida del comando ps, se limita el resultado a las líneas que contienen una cadena de caracteres en particular; por ejemplo, para encontrar rápidamente el PID del proceso sleep:
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:45 ? 00:00:02 /sbin/init
root 2 0 0 09:45 ? 00:00:00 [kthreadd]
root 3 2 0 09:45 ? 00:00:00 [ksoftirqd/0]
root 4 2 0 09:45 ? 00:00:00 [migration/0]
root 5 2 0 09:45 ? 00:00:00 [watchdog/0]
root 6 2 0 09:45 ? 00:00:00 [events/0]
...
root 1528 1 0 09:46 ? 00:00:00 crond
root 1542 1 0 09:46 ? 00:00:00 /usr/sbin/atd
root 1550 1 0 09:46 ? 00:00:00 /usr/sbin/gdm-binary -nodaemon
root 1555 1 0 09:46 tty2 00:00:00 /sbin/mingetty /dev/tty2
root 1557 1 0 09:46 tty3 00:00:00 /sbin/mingetty /dev/tty3
root 1559 1 0 09:46 tty4 00:00:00 /sbin/mingetty /dev/tty4
root 1561 1 0 09:46 tty5 00:00:00 /sbin/mingetty /dev/tty5
root 1565 1 0 09:46 tty6 00:00:00 /sbin/mingetty /dev/tty6
root 1573 1550 0 09:46 ? 00:00:00 /usr/libexec/gdm-simple-slave...
cut
El comando cut permite extraer columnas o campos seleccionados a partir de su entrada estándar o de archivos.
Extracción de campos
La primera sintaxis del comando cut para extraer campos es:
cut -f campo(s) -d delimitador archivo(s)
Cuando se especifican varios campos, los números se separan con comas.
Para mostrar sólo el tercero y el sexto campo del archivo /etc/passwd:
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
javier:x:1000:1000:Javier Olivares:/home/javier:/bin/bash
linus:x:1004:1000:Linus Torvalds:/home/linus:/bin/bash
richard:x:1005:1000:Richard M. Stallman:/home/richard:/bin/bash
ken:x:1001:1000:Ken Thompson:/home/ken:/bin/bash
dennis:x:1002:100:Dennis Ritchie:/home/dennis:/bin/bash
eric:x:1006:1000:Eric S. Raymond:/home/eric:/bin/bash
alan:x:1007:1000:Alan Cox:/home/alan:/bin/bash
gordon:x:1003:1000:Gordon E. Moore:/home/gordon:/bin/bash
$ cut -f 3,6 -d : /etc/passwd
0:/root
1:/bin
1000:/home/javier
1004:/home/linus
1005:/home/richard
1001:/home/ken
1002:/home/dennis
1006:/home/eric
1007:/home/alan
1003:/home/gordon
Extracción de columnas
El separador de campos es un carácter definido por la opción -d, por lo que no es posible...
sort
El comando sort ordena las líneas de un archivo (o su entrada estándar) y devuelve el resultado en su salida estándar.
Su sintaxis general es:
sort -t delimitador -k campo.carácter opción(s) archivo
El archivo de ejemplo frutas utilizado en esta sección es:
manzana.2
tomate.10
pera.4
En su expresión más simple, sort ordena alfabéticamente por el primer carácter de cada línea:
$ sort frutas
manzana.2
pera.4
tomate.10
La clasificación puede empezar a partir de cualquier carácter de cualquier campo en el archivo. Se usa entonces la sintaxis -kn.m donde n es el número de campo y m el número del carácter en el campo. Si el número de carácter se omite, la ordenación se efectuará a partir del primer carácter del campo especificado.
A diferencia del comando cut, el separador de campos predeterminado es uno o más caracteres de espacio. Además, es modificable con la opción -t.
Veamos una clasificación a partir del tercer carácter en el primer campo de cada línea:
$ sort -k1.3 frutas
tomate.10
manzana.2
pera.4
Veamos una clasificación sobre el primer carácter del segundo campo de cada línea:
$ sort -t. -k2 frutas
tomate.10
manzana.2
pera.4
La opción -n clasifica los campos numéricos...
head, tail
Los comandos head y tail permiten respectivamente mostrar sólo el principio o el final de los archivos.
El comando head muestra de modo predeterminado las diez primeras líneas de un archivo. Se puede modificar esta opción a las N primeras líneas del archivo con la sintaxis head -nN.
El comando tail muestra de modo predeterminado las diez últimas líneas de un archivo. Se puede cambiar este valor de dos modos:
tail -nN |
muestra las N últimas líneas del archivo. |
tail -n+N |
muestra desde la línea N hasta el final del archivo. |
En resumen, se obtiene:
El comando tail se usa también para consultar archivos escritos al mismo tiempo por otros procesos, como archivos de registro. La opción -f le indica al comando tail que lea las nuevas líneas del archivo de entrada a medida que estén disponibles; esto permite controlar el crecimiento del archivo.
Sólo se puede utilizar la opción -f de tail especificando un archivo. Es imposible emplearlo cuando el comando lee los datos en su entrada estándar.
Para detener la visualización con la opción -f, se interrumpe el comando con las teclas [Ctrl]+[c].
Ejercicios
Ejercicio 1
Cuente el número de subdirectorios presentes en /etc.
Solución
Bastará con listar los archivos con sus detalles (ls -l) para mostrar su tipo (primer carácter de cada línea devuelta) y de filtrar las líneas que comiencen con el carácter d (grep ’^d’).
Las lineas correspondientes a los subdirectorios de /etc podrán entonces ser contadas empleando el comando wc -l o la opción -c de grep:
[javier]$ ls -l /etc | grep '^d' | wc -l
137
[javier]$ ls -l /etc | grep -c '^d'
137
Ejercicio 2
Encuentre todos los archivos de los que es propietario en el sistema.
Solución
El comando find con el parámetro de búsqueda -user es el más adecuado para esta tarea:
[javier]$ find / -user javier 2>/dev/null
/run/media/javier/Fedora-Live-WS-x86_64-23-10
/run/media/javier/Fedora-Live-WS-x86_64-23-10/EFI
/run/media/javier/Fedora-Live-WS-x86_64-23-10/EFI/BOOT
/run/media/javier/Fedora-Live-WS-x86_64-23-10/EFI/BOOT/BOOTX64.EFI
/run/media/javier/Fedora-Live-WS-x86_64-23-10/EFI/BOOT/fonts
...
Una redirección de los mensajes de error a /dev/null se requiere para eliminar todas las alertas referentes a los permisos de acceso a algunos directorios del sistema a los que el usuario no tiene acceso.
Ejercicio 3
Ordene por tamaño los últimos 10 archivos...