El intérprete de comandos puede ser un gran aliado de usuarios, administradores y programadores, porque permite automatizar labores rutinarias y componer diversos programas para que interactúen y realicen labores complejas.
La idea para componer diversos programas es formar "tuberías" en las que cada tubo es un programa cuya salida se conecta como entrada a otro. Esta idea se comenzará a desarrollar en esta guía, introduciendo primero algunas facilidades del intérprete de comandos bash [31] para editar comandos, después se presentarán algunos programas y comandos de bash y finalmente se presentará como se compone y se controla el flujo de datos.
Para recibir información del usuario bash y otros programas emplean las librerías readline y history. readline brinda facilidades para escribir comandos con un teclado y history almacena los últimos comandos que el usuario haya dado para facilitar su reutilización. Algunas de las posibilidades que estas librerías ofrecen son:
- Flechas o Control-p, Control-n
- Para "navegar"sobre la historia de comandos
- Completación con Tab
- Puede emplear la tecla Tab para completar nombres de programas, de máquinas (mencionadas en el archivo /etc/hosts) o de usuarios, si hay varias posibles completaciones un segundo Tab presentará la lista de posibilidades. Por ejemplo: si estando en bash teclea chm y después presiona Tab, se completará el nombre del comando a chmod; si teclea ls /usr/inc y presiona Tab se completará la vía/usr/include; si teclea finger @ y después Tab dos veces verá los nombres de algunas máquinas conocidas por su sistema; si teclea ls ~ y presiona Tab dos veces verá los nombres de usuarios (ls ~carlosmostrará el contenido del directorio personal del usuario con login carlos).
- Edición con teclas de emacs o vi
- readline puede configurarse para efectuar algunas operaciones de edición bien con las teclas de emacs o bien con las de vi. Por ejemplo cuando las teclas de emacs están configuradas (que es la opción por defecto) puede emplear las flechas hacía atrás y adelante (o Control-f y Control-b) para devolverse o avanzar sobre el comando; Control-a para ir al comienzo; Control-e para ir al final; Control-k para cortar el resto del comando; Control-y para insertar el texto antes cortado. Cuando las teclas de vi están configuradas puede presionar ESC para pasar a modo comando y usar las teclas h, j, k y l (o las flechas) para moverse o f para buscar una letra en la línea que está editando.
- Buscar comandos en la historia de comandos
- Puede buscar un comando entre los que ya ha tecleado para reutilizarlo. Con el modo emacs emplee Control-r y comience a teclear el comando que busca --es una búsqueda incremental, en el modo vi emplee / y después teclee parte del comando que busca.
Un sistema Linux cuenta con gran cantidad de herramientas, cada una de las cuales realiza una labor muy específica pero rápidamente y bien; en esta sección presentamos unas cuantas típicamente usadas para procesar textos planos. Junto con cada herramienta presentamos algunas de sus opciones y ejemplos de su uso (la documentación completa de cada herramienta puede consultarse en la página del manual o en la documentación info).
- cat, tac, nl, more, less, head, tail
- Permiten ver uno o más archivo o parte de un archivo. cat y tac presentan los archivos que reciben uno a continuación de otro, aunque tac los presenta invertidos. La orden:
cat /etc/profile /etc/hostname
presenta el archivo /etc/profile y a continuación /etc/bashrc. cat entre sus opciones acepta -n con la cual numera las líneas, aunque esa labor puede hacerse mejor con nl. more y less permiten al usuario "desplazarse" sobre uno o más archivos empleando teclas (e.g barra espaciadora para avanzar una página), less permite también buscar y acepta algunos comandos como los de vi. head y tailmuestran parte del comienzo o del final de un archivo, por defecto 10 líneas aunque puede especificarse la cantidad de líneas con la opción -n o puede especificarse la cantidad de bytes con la opción -c. - split, csplit
- Dividen un archivo en varias partes. split divide empleando como criterio un tamaño, mientras que csplit divide de acuerdo al contexto ---divide cada vez que en el texto aparezca una cadena [32] o patrón.split acepta como opciones para especificar el tamaño -b y -l, el primero seguido del tamaño en bytes y el segundo seguido del tamaño en líneas. Por ejemplo, para dividir un archivo grande en partes de 100000 bytes:
split -b 100000 grande
las partes quedarán en archivos con nombres como xaa, xab, etc. Para dividir un archivo dir.txt siempre que la palabra nombre aparezca:csplit dir.txt /nombre/ {*}
En el ejemplo anterior la cadena por buscar [33] se especificó a continuación del nombre del archivo entre los caracteres '/', la cadena final "{*}" indica que debe dividirse cada vez que se encuentre una nueva ocurrencia de nombre, si no se usa csplit sólo buscará la primera ocurrencia y dividirá el archivo en dos partes, si en vez de * se emplea un número csplit buscará a lo sumo esa cantidad de veces la palabra y dividirá el archivo por cada ocurrencia que encuentre. - sort
- Por defecto ordena las líneas de un archivo, con la opción -m mezcla dos archivos ordenados y con la opción -c verifica que un archivo esté ordenado. Al ordenar puede considerar las líneas completas, considerarlas números enteros (opción -n) o flotantes (opción -g), considerarlas meses (opción -M) o dividirlas en campos y emplear algunos campos como llaves de ordenamiento (opción -k para especificar llaves y -t para cambiar separador de campos). En las comparaciones puede ignorar diferencias entre mayúsculas y minúsculas con la opción -f, puede ordenar de mayor a menor con la opción-r ---por defecto ordena de menor a mayor--- y puede eliminar líneas repetidas con la opción -u [34].Por ejemplo para ordenar por líneas el archivo nombres.txt:
sort nombres.txt
si cada línea del archivo nombres.txt tiene el apellido y después el nombre de una persona separados por espacios, puede ordenarse por nombre con:sort -k 2 nombres.txt
- wc
- Cuenta cantidad de palabras, líneas y caracteres en uno o más archivos. Por defecto presenta los tres datos por cada archivo que reciba y después presenta las sumas. Con la opción -c presenta la cuenta de palabras, con -l la cuenta de líneas, con -w la cuenta de palabras y con -L la longitud de la línea más larga.
En Unix, todo programa tiene 3 canales estándar para intercambiar información con el usuario, con el hardware o con otros programas: salida estándar, entrada estándar y error estándar, que verá abreviados comostdout, stdin y stderr respectivamente. Estos canales pueden conectarse a archivos, a dispositivos o a canales de otros programas (tuberías). Por defecto la entrada estándar es el teclado, mientras que la salida y el error estándar son la pantalla.
Por ejemplo los programas cat y sort si no reciben un archivo como parámetro esperan información de la entrada estándar y envián el resultado de su operación a la salida estándar; para comprobarlo ejecute el programa cat o el programa sort sin argumentos.
Para redireccionar la salida estándar a un archivo se agrega al final del comando una cadena de la forma "> nombre_archivo". Por ejemplo para ordenar un archivo palabras.txt y dejar el resultado enord.txt:
sort palabras.txt > ord.txt
Para redireccionar el error estándar a un archivo se agrega tras el nombre del comando 2> nombre_archivo [35]. Por ejemplo:
cat /ceq11 2> err.txt
escribirá en el archivo err.txt un mensaje como "cat: /ceq11: No existe el fichero o el directorio" ---claro está mientras efectivamente no exista el archivo /ceq11. Pueden redireccionarse tanto salida estándar como error estándar simultáneamente, por ejemplo:
cat /etc/fstab > /dev/null 2> /dev/null
redireccionará tanto salida como error estándar al dispositivo /dev/null ---El dispositivo /dev/null es como un agujero negro, todo lo que envié ahí desaparece (ver Ubicación de archivos y directorios).
Por defecto al redireccionar con > a un archivo, se crea un nuevo archivo, en caso de que ya existiera su contenido previo se pierde y es remplazado por la información redireccionada. Por ejemplo después de ejecutar la secuencia:
sort 1.txt > ord.txtsort 2.txt > ord.txt
quedará en ord.txt únicamente el contenido de 2.txt ordenado. Para agregar la información redireccionada al final de un archivo ya existente puede emplear >> en lugar de >, retomando el ejemplo anterior:
sort 1.txt > ord.txtsort 2.txt >> ord.txt
dejará en ord.txt el contenido de 1.txt ordenado y a continuación el de 2.txt ordenado.
Para lograr que la entrada estándar sea leída de un archivo, se agrega al final del comando < nombre_archivo. Por ejemplo
head < arc.txt
presentará las 10 primeras líneas del archivo arc.txt (es equivalente a head arc.txt o a head - < arc.txt [36]). Poder redireccionar la entrada estándar de un programa puede ahorrarle tiempo, porque puede escribir la secuencia de líneas que desea enviar al programa en un archivo y después repetirla tantas veces como desee. Por ejemplo para enviar el mismo correo electrónico a varias personas puede escribirlo en un archivo correo.txt y después ejecutar algo como:
mail usuario1@micolegio.edu.co usuario2@micolegio.edu.co < correo.txt.
Empleando redireccionamiento y los comandos y programas que ya se han presentado se pueden hacer rápidamente muchas labores. Un ejemplo es dividir un archivo grande para transportarlo en varios disquetes: con split -b 1000000 grande.gz divide el archivo grande.gz en varias partes, cada una de las cuales cabe en un disquete (digamos que queda dividido en tres partes xaa, xab y xac). Puede copiar cada una de las partes en un disquete, llevar los disquetes a otro computador y emplear cat y redireccionamiento para unirlos:
cat xaa xab xac > grande.gz
Otra facilidad para redireccionar entrada estándar es <<, que después de un comando permite escribir un texto que se constituirá en la entrada estándar. A continuación de << debe ponerse una palabra, escogida por usted, que indicará fin de entrada. La entrada estándar constará de las líneas que se digiten a continuación hasta la primera que contenga sólo la palabra que indicaba fin de entrada. Por ejemplo:
sort <<FINpábuloFINopíparo
ordenará las palabras dadas (excepto FIN que indica el fin de la entrada). Así, << es equivalente a editar un archivo y después redireccionarlo a la entrada estándar de un programa.
El operador de composición '|' permite redireccionar la salida de un comando en la entrada estándar de otro (es como pegar dos tubos). Por ejemplo:
ls -l / | wc -l
mostrará la cantidad de archivos y directorios en el directorio /. Al ejecutar ls -l / se envía a salida estándar la lista de archivos del directorio raíz, cada uno en una línea, con '|' esta salida se convierte en entrada dewc -l; el programa wc con la opción -l presenta sólo la cantidad de líneas de la entrada estándar.
El ejemplo anterior pudo haberse realizado en dos pasos empleando un archivo temporal, digamos temp.txt:
ls -l / > temp.txtwc -l < temp.txt
pero claro está, | es más práctico y aún más cuando deben componerse más de dos programas.
No hay comentarios:
Publicar un comentario