lunes, 2 de junio de 2014

bash y el juego de herramientas Linux

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.

2.1.1. Ayudas interactivas de bash (readline y history)

Para recibir información del usuario bash y otros programas emplean las librerías readline y historyreadline 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-pControl-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 hjk 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.

2.1.2. Algunas herramientas

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).
cattacnlmorelessheadtail
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/bashrccat entre sus opciones acepta -n con la cual numera las líneas, aunque esa labor puede hacerse mejor con nlmore 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.

splitcsplit
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 xaaxab, 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.

2.1.3. Redirección y tuberías

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 comostdoutstdin 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.txt
sort 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.txt
sort 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 xaaxab 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 <<FIN
pábulo
FIN
opípar
o
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.txt
wc -l < temp.txt
pero claro está, | es más práctico y aún más cuando deben componerse más de dos programas.

  1. Angel J. Reynoso
    kp01 
    Tel.: 829-997-4870
    kp01aj@gmail.com

No hay comentarios:

Publicar un comentario