Capítulo 7


 

Pequeños programas potentes

better !pout !cry

better watchout

lpr why

santa claus <north pole >town

 

cat /etc/passwd >list

ncheck list

ncheck list

cat list _ grep naughty >nogiftlist

cat list _ grep nice >giftlist

santa claus <north pole > town

 

who _ grep sleeping

who _ grep awake

who _ egrep 'bad_good'

for (goodness sake) -

be good

"

 

7.1 El poder de Unix

El poder de Unix1 se esconde en pequeños comandos que no parecen ser muy útiles cuando se utilizan por separado, pero combinados con otros (directa o indirectamente) proporcionan un entorno mucho más potente y flexible que la mayoría de los otros sistemas operativos. Los comandos de los que hablaremos en este capítulo son entre otros: sort, grep, more, cat, wc, spell, diff, head, y tail.

Veremos lo que cada una de las utilidades hace por separado y luego daremos algunos ejemplos de como utilizarlos conjuntamente2.

_____________________________________________

1 N. del T.: El cookie de apertura de este capítulo es la traducción a comandos Unix de una canción de navidad:

"Santa Claus is coming to town" (escrita por H. Gillespie, J. F. Coots)

2 Nótese que los resúmenes de los comandos en este capítulo no son extensos. Para mas información vea la página del manual correspondiente con el comando man.

 

7.2 Trabajando con ficheros

Junto a comandos como cd, mv, y rm que ya se vieron en el Capítulo 4, hay otros comandos que trabajan con ficheros pero no con los datos contenidos en ellos. Estos son touch, chmod, du, y df.

Ninguno de ellos se preocupa por lo que contiene el fichero, simplemente modifican algunas de las informaciones que Unix guarda acerca del fichero.

Estos comandos manipulan:

o Los registros de tiempo. Todo fichero tiene tres fechas asociadas a él.3 Las tres fechas son las siguientes: creación del fichero, última modificación (cuando se produjo el último cambio en el fichero), y último acceso (cuando se produjo la última lectura del fichero).

o El dueño. Cada fichero en Unix pertenece a un único propietario.

o El grupo. Cada fichero tiene también asociados un grupo de usuarios. El grupo más usual para los ficheros de usuario se denomina users, que es al cual, por lo general, pertenecen todos los usuarios con cuenta en el sistema.

o Los permisos. Cada fichero tiene ciertos permisos (también llamados "privilegios") asociados a él, que indican a Unix quién puede acceder a ese fichero, cambiarlo o en el caso de ser un programa, ejecutarlo. Cada uno de estos permisos puede ser establecido por separado para el dueño, el grupo, y el resto de usuarios.

 

- touch fichero1 fichero2 . . . ficheroN

touch actualiza los registros de fecha y hora con la fecha y hora actual de los ficheros indicados en la linea de comandos. Si el fichero no existe, touch lo creará. También es posible especificar la fecha y hora a registrar en la información de los ficheros_consulte la página del manual (comando man) para más información sobre touch.

 

- chmod [-Rfv] modo fichero1 fichero2 . . . ficheroN

El comando que se utiliza para modificar los permisos de un fichero es el chmod4. Antes de

meternos en como utilizar este comando, veamos primero que permisos hay en Unix. Cada fichero tiene asociados un grupo de permisos. Estos permisos le indican al sistema operativo quien puede leer, escribir o ejecutar como programa el fichero. (A continuación, se explica como puede un usuario hacer estas cosas. Un programa ejecutado por un usuario puede hacer las mismas cosas que las que le estén permitidas al propio usuario; esto puede suponer un problema de seguridad, si se desconoce lo que hace cada programa en particular.)

_____________________________________________

3 Los antiguos sistemas de ficheros de Linux sólo almacenaban una fecha, ya que derivaban de Minix. Si se utiliza alguno de estos sistemas de ficheros, parte de la información no estará disponible y las operaciones que se realicen sobre ellas serán inútiles.

4 N. del T.: Abreviatura de change mode, cambiar modo.

 

Unix reconoce tres tipos diferentes de individuos: primero, el propietario del fichero (y la persona que puede utilizar el comando chmod sobre ese fichero). Segundo, el "grupo". El grupo de la mayoría de los ficheros normales de un usuario del sistema será "users". (Para ver el grupo de un fichero en particular, utilizar "ls -l fichero" .) Por último, está el "resto" que no son ni propietarios ni pertenecen al grupo, denominados "otros"5

De esta forma, por ejemplo, un fichero puede tener permisos de lectura y escritura para el propietario, permiso de lectura para el grupo y ningún tipo de permisos para otros. O por alguna razón, un fichero puede tener permisos de lectura/escritura para el grupo y otros, pero ¡ningún privilegio para el propietario!

Veamos algunos ejemplos de como cambiar permisos utilizando chmod. Primero creamos un fichero utilizando cat, emacs, o cualquier otro programa. Por defecto, son posibles las operaciones de lectura y de escritura sobre el fichero. (Los permisos dados a otros usuarios dependen de cómo estén establecidas las variables del sistema y de la cuenta del usuario). Podemos asegurarnos de que tenemos permiso de lectura utilizando el comando cat, a continuación eliminamos el privilegio de lectura para nosotros mismos utilizando "chmod u-r fichero" 6 . Ahora si intentamos leer el fichero, obtendremos el mensaje de error Permission denied. Devolvemos el privilegio de lectura utilizando "chmod u+r fichero".

Los permisos de directorio utilizan las tres mismas ideas anteriores: leer, escribir, y ejecutar, pero con ligeras variaciones. El privilegio de lectura permite al usuario (o al grupo, o a otros) leer el directorio, listar los nombres de los ficheros. El permiso de escritura permite añadir o borrar ficheros. El permiso de ejecución permite al usuario acceder a ficheros en el directorio o a cualquier subdirectorio. (Si un usuario no tiene permisos de ejecución para un directorio, entonces no puede siquiera hacer un cd al mismo).

Para utilizar chmod, reemplazar el modo por el usuario, grupo, otro o todos (all) y la operación a realizar. (Es decir, utilizar un signo más "+" para añadir privilegios y un menos "-" para quitarlos.

Un signo igual "=" indica los mismos permisos para los usuarios involucrados en el modo). Los permisos posibles son lectura (read), escritura (write) , y ejecución (execute).

La opción "-R" al utilizar chmod cambiará los permisos de un directorio, de todos los ficheros contenidos en él, y de forma recursiva los permisos del árbol de subdirectorios a partir de él. La opción "-f" fuerza a que chmod intente cambiar los permisos incluso si el usuario no es el dueño del fichero. (Si se utiliza el parámetro "f" al ejecutar chmod no se mostrará un mensaje de error en caso de que no pueda cambiar los permisos del fichero.), por último la opción "v" hace que la ejecución del chmod informe de todo lo que hace.

_____________________________________________

5 N. del T.: En ingles: "owner" (con "u" de "user"), "group" and "others" respectivamente.

6 N. del T.: El parámetro u-r indica "user minus read", es decir: usuario menos lectura.

 

7.3 Estadísticas del sistema

Los comandos de esta sección son de utilidad a la hora de mostrar las estadísticas del sistema operativo, o de una parte de él.

 

- du [-abs] [trayectoria1 trayectoria2 . . . trayectoriaN]

El comando du7 contabilizará el espacio de disco ocupado por un subdirectorio y todos sus subdirectorios. El uso de este comando sin utilizar parámetros devolverá una lista de cuanto disco consume cada subdirectorio del directorio actual, y al final del informe, cuanto disco utiliza el directorio (y todos sus subdirectorios). Si se le pasa uno o más parámetros, devolverá la cantidad de espacio utilizado por esos ficheros o directorios en lugar de la del directorio actual.

La opción "a" mostrará además del espacio de los directorios, el de los ficheros. Utilizando "b" como opción presentará el total en bytes, en lugar de kilobytes (1 kilobyte = 1024 caracteres)8.

Finalmente el parámetro "s" informará sólo acerca de los directorios explicítos en la linea de comando y no de sus subdirectorios.

 

- df

El comando df9 resume la cantidad de espacio utilizada en el disco. Para cada sistema de ficheros (recuerde que sistemas de ficheros diferentes son o bien unidades físicas o particiones diferentes) muestra el espacio total de disco, la cantidad utilizada, la cantidad disponible y la capacidad total del sistema de ficheros que se utiliza.

Un caso extraño que puede darse es la posibilidad de tener una capacidad superior al 100%, o que la cantidad utilizada más la disponible no sea igual a la total. Esto es debido a que Unix reserva parte del espacio de cada sistema de ficheros para el directorio raíz. De esta forma aunque algún usuario accidentalmente sature el disco, el sistema todavía tendrá un poco de espacio para seguir operativo.

Este comando no ofrece opciones que puedan ser de utilidad al usuario.

 

- uptime

El comando uptime10 informa sobre el tiempo en el que el sistema ha estado activo, es decir el tiempo transcurrido desde que Unix arrancó por última vez.

Este comando también devuelve la hora actual y el promedio de carga que soporta el sistema. El promedio de carga es el número medio de procesos esperando a ejecutar en un determinado periodo de tiempo. uptime muestra el promedio de carga del último minuto y de los cinco y diez últimos minutos. Si este promedio de carga se aproxima a cero indica que el sistema ha estado relativamente desocupado; por el contrario si el promedio es cercano al uno indica que el sistema ha estado casi completamente utilizado pero en ningún momento sobrecargado. Los promedios de carga altos son el resultado de la ejecución simultánea de varios programas.

Extraordinariamente, uptime es uno de los pocos comandos de Unix que ¡no tienen opciones!

_____________________________________________

7 N. del T.: Abreviatura de disk usage, utilización del disco.

8 Un byte es el equivalente de una letra en un documento de texto.

9 N. del T.: Abreviatura de disk filling, espacio disponible en el disco.

10 N. del T.: Tiempo en estado activo.

 

- who

El comando who muestra los usuarios activos en ese momento en el sistema y cuando han iniciado su respectiva sesión. Si le damos los parámetros "am i" (es decir : "who am i" ), nos devuelve la información relativa a nosotros mismos.11

 

- w [-f] [nombre_usuario]

El programa w devuelve los usuarios actuales del sistema y que están haciendo. (Básicamente combina la funcionalidad de uptime y who. La cabecera del informe que presenta w es exactamente la misma que uptime, siendo la información de cada una de las líneas la siguiente: el nombre del usuario, hora de inicio de la sesión (y cuanto tiempo ha estado ocioso). JCPU es la cantidad total de tiempo de CPU utilizada por ese usuario, mientras que PCPU es la cantidad total de tiempo utilizada por sus tareas actuales.

Si al comando se le pasa la opción "f", mostrará los sistemas remotos desde los que los usuarios acceden, si los hay. Puede indicarse un nombre de usuario como parámetro para mostrar sólo información relativa a él.

 

7.4 ¿Qué hay en un fichero?

Principalmente hay dos comandos en Unix para listar ficheros, cat y more. Sobre ambos ya se habló en el Capítulo 6.

 

- cat [-nA] [fichero1 fichero2 . . . ficheroN]

cat no es un comando de uso amigable, no espera a que el usuario acabe de leer el fichero, y se utiliza generalmente en contextos de tuberías. Aunque pueden utilizarse algunas opciones muy útiles del comando, por ejemplo, "n" numera todas las líneas del fichero, y "A" mostrará los carácteres de control como carácteres normales en lugar de hacer (posiblemente) cosas extrañas en la pantalla.

(Recuerde que para ver las opciones más curiosas y quizá "menos útiles" utilice el comando man: "man cat". Si no se especifican ficheros en la línea de comandos, cat aceptará la entrada desde stdin12.

_____________________________________________

11 N. del T.: literalmente es como preguntar al sistema ¿quién soy yo?

 

- more [-l] [+número_línea] [fichero1 fichero2 . . . ficheroN]

more es más útil, y además es el comando recomendado para ver ficheros de texto ASCII. La única opción interesante es "l" , que indica al comando que no se desea interpretar el carácter |_Ctrl-L_| como carácter de "nueva página". El comando comenzará en la línea número_línea especificada.

Al ser more un comando interactivo, hemos resumido a continuación las órdenes más comunes:

|_Barra-espaciadora_| Pasar a la siguiente pantalla de texto.

|_d_| Pasar 11 líneas de pantalla, o aproximadamente la mitad de una pantalla normal: 25 líneas.

|_/_|Busca una expresión regular. La construcción de una expresión regular puede ser muy complicada por lo que es recomendable teclear simplemente el texto a buscar. Por ejemplo, /sapo |_Intro_| buscará la primera ocurrencia de "sapo" en el fichero a partir de la posición actual.

La misma tecla seguida por un |_Intro_| buscará la siguiente ocurrencia de la última expresión buscada.

|_n_| Buscará la próxima aparición de la expresión regular especificada.

|_:_||_n_| Pasar al siguiente fichero, en caso de que se especifique más de un fichero en la línea de comandos.

|_:_||_p| Pasar al fichero anterior.

|_q_| Terminar more.

 

- head [-líneas] [fichero1 fichero2 . . . ficheroN]

head mostrará las primeras diez líneas de los ficheros especificados, o las primeras diez líneas de la stdin si no se especifica ningún fichero en la línea de comandos. Cualquier opción numérica se tomará como el número de líneas a mostrar, por ejemplo "head -15 rana" mostrará las primeras quince líneas del fichero rana.

 

- tail [-líneas] [fichero1 fichero2 . . . ficheroN]

Como head, tail mostrará solo una parte del fichero, en este caso el final del fichero, las últimas diez líneas del fichero, o que provengan de la stdin. tail también acepta la opción de especificar el número de líneas, como en el caso anterior.

_____________________________________________

12 N. del T.: standard input, entrada estándar, generalmente entrada de datos por teclado.

 

- file [fichero1 fichero2 . . . ficheroN]

El comando file intenta identificar que tipo de formato tiene un fichero en particular. Debido a que no todos los ficheros tienen extensión o otras formas de identificarlos fácilmente, este comando realiza algunas comprobaciones rudimentarias para intentar comprender exactamente que contiene el fichero.

Hay que tener cuidado ya que es bastante posible que file realice una identificación incorrecta.

 

7.5 Comandos de edición

Esta sección trata de los comandos que alteran un fichero, realizando sobre el fichero operaciones concretas o mostrando estadísticas del mismo.

 

- grep [-nvwx] [-número] expresión [fichero1 fichero2 . . . ficheroN ]

Uno de los comandos más útiles de Unix es el grep13, utilizado para buscar expresiones en un fichero de texto. La forma más sencilla de usarlo es:

/home/larry$ cat animales

Los animales son unas criaturas muy interesantes. Uno de mis animales favoritos es el tigre, una temible bestia con grandes colmillos.

Tambien me gusta el leon--- realmente increible!

/home/larry$ grep igre animales

el tigre, una temible bestia con grandes colmillos.

/home/larry$

 

Una de los problemas de esta forma de usarlo, es que simplemente muestra las líneas que contienen la palabra a buscar, no aporta información acerca de donde buscar en el fichero, es decir el número de línea. Pero dependiendo de lo que se pretenda puede ser hasta más que suficiente, por ejemplo si se buscan los errores de la salida de un programa, se puede probar "a.out _ grep error" , donde "a.out" es el nombre del programa.

Cuando es necesario conocer donde están las palabras a buscar, es decir el número de línea, hay que utilizar la opción "n" . Si lo que se desea es ver todas las líneas donde no se encuentra la expresión especificada, entonces utilice la opción "v".

Otra posibilidad que ofrece el grep es la búsqueda de partes de una palabra, como en el ejemplo anterior que "igre" se equiparó con "tigre" . Para buscar sólo palabras completas hay que pasarle al grep la opción "w" , y para líneas completas la opción es "x" .

Si no se especifica ningún fichero (por ejemplo: "grep igre" ), grep examinará la stdin.

_____________________________________________

13 N. del T.: Abreviatura de generalized regular expression parser, analizador general de expresiones regulares.

 

- wc [-clw] [fichero1 fichero2 . . . ficheroN ]

El comando wc14 simplemente cuenta el número de palabras, líneas y caracteres en los ficheros pasados como parámetros. Si no se especifica ningún fichero, operará sobre la stdin. Los tres parámetros, "clw" , indican el elemento a contar: caracteres, líneas y "w" para palabras.

Por ejemplo, "wc -cw" contará el número de caracteres y palabras, pero no el número de líneas. Si no se indica ningún parámetro wc cuenta todo: palabras, líneas y caracteres.

Se puede utilizar wc para saber el número de ficheros de un directorio: "ls _ wc -w". Si se desea saber el número de ficheros que acaban en .c, entonces ejecute "ls *.c _ wc -w".

 

- spell [fichero1 fichero2 . . . ficheroN]

spell es el corrector ortográfico más sencillo de Unix generalmente para inglés americano15.

spell es un filtro, igual que la mayoría de los comandos que hemos comentado antes, que toma el fichero de texto ASCII y devuelve todas las palabras que considera erróneas. spell opera sobre los ficheros especificados, y si no se incluye ninguno, entonces utiliza la stdin.

También es posible que esté disponible en su máquina ispell, que es un corrector ortográfico un poco más sofisticado. ispell ofrece diversos vocabularios y un menú más manejable en caso de ejecutarlo con un fichero en la línea de comandos. También puede ejecutarse como un filtro si no se especifica ningún fichero.

La forma de trabajar con ispell es bastante obvia, pero si necesita más ayuda consulte la página del manual correspondiente: "man ispell" .

 

- cmp fichero1 [fichero2]

cmp compara dos ficheros. El primero debe ser obligatoriamente pasado como parámetro, mientras que el segundo puede ser pasado como un segundo parámetro o leído desde la entrada estándar. cmp es muy sencillo, y simplemente dice donde se diferencian los dos ficheros.

 

- diff fichero1 fichero2

Uno de los comandos estándar más complejos de Unix es el diff. La versión GNU de diff tiene hasta ¡veinte opciones! en la línea de comandos. Es una versión mucho más potente que cmp y muestra cuales son las diferencias en lugar de decir simplemente donde está la primera.

Ya que una buena parte de las opciones del diff están más allá del alcance de este manual, simplemente hablaremos del funcionamiento básico. Brevemente, diff toma dos parámetros y muestra las diferencias entre ellos línea a línea. Por ejemplo:

/home/larry$ cat rana

Los animales son una criaturas muy interesantes. Uno de mis animales favoritos es el tigre, una temible bestia con grandes colmillos.

Tambien me gusta el leon--- realmente increible!

/home/larry$ cp rana sapo

/home/larry$ diff rana sapo

/home/larry$ cat perro

Los animales son una criaturas muy nteresantes. Uno de mis animales favoritos es

el tigre, una temible bestia con grandes colmillos.

Tambien me gusta el leon--- realmente increible!

/home/larry$ diff rana perro

1c1,2

< Los animales son una criaturas muy interesantes. Uno de mis animales favoritos es

----

> Los animales son una criaturas muy nteresantes. Uno de mis animales favoritos es

>

3c4

< Tambien me gusta el leon--- realmente increible!

----

> Tambien me gusta el leon--- realmente increible!

/home/larry$

 

_____________________________________________

14 N. del T.: Abreviatura de word count, contar palabras.

15 Aunque hay versiones del corrector para diversas lenguas europeas, la copia que puede encontrarse en su máquina Linux es con toda probabilidad para inglés americano.

 

Como puede observarse, diff no devuelve nada cuando los dos ficheros son iguales. Pero cuando hemos comparado dos ficheros diferentes, se muestra una cabecera de sección, "1c1,2" indicando que ha comparando la línea 1 del fichero de la izquierda, rana, con las líneas 1-2 de perro y las diferencias que ha encontrado. Luego ha comparado la línea 3 de rana con la línea 4 de perro.

Aunque pueda parecer extraño que compare diferentes números de línea, es bastante eficiente ya que es posible que pueda haber algún retorno de línea de más en alguno de los ficheros.

 

- gzip [-v#] [fichero1 fichero2 . . . ficheroN]

- gunzip [-v] [fichero1 fichero2 . . . ficheroN]

- zcat [fichero1 fichero2 . . . ficheroN]

Estos tres programas se utilizan para comprimir y descomprimir datos. gzip, o GNU Zip, es un programa que lee de los ficheros originales y devuelve ficheros más pequeños, borra los ficheros especificados en la línea de comandos y los reemplaza con ficheros que tienen el mismo nombre pero con .gz añadido a su nombre.

 

- tr cadena1 cadena2

El comando de "traducción de caracteres" opera sobre la entrada estándar, no acepta un nombre de fichero como parámetro. Reemplaza todas las ocurrencias de cadena1 en la entrada con la cadena2. En comparación con llamadas tan sencillas como "tr rana sapo" , tr puede aceptar comandos más complejos. Por ejemplo, hay una forma rápida de convertir los caracteres en minúscula por otros en mayúscula:

/home/larry$ tr -:lower:] [:upper:]

Esta es una frase RARA.

ESTA ES UNA FRASE RARA.

 

tr es relativamente complejo y se usa normalmente en pequeños programas shell, como filtro.