3.2 Lección 1
Certificación: |
Linux Essentials |
---|---|
Versión: |
1.6 |
Tema: |
3 El poder de la línea de comandos |
Objetivo: |
3.2 Buscar y extraer datos de los ficheros |
Lección: |
1 de 2 |
Introducción
Este laboratorio se enfoca en la redirección o la transmisión de información de una fuente a otra con la ayuda de herramientas específicas. La línea de comandos de Linux redirige la información a través de canales estándares. La entrada estándar (stdin o channel 0) de un comando se considera el teclado, y la salida estándar (stdout o channel 1) se considera la pantalla. También existe otro canal destinado a redirigir la salida de errores (stderr o channel 2) de un comando o los mensajes de error de un programa. La entrada y/o salida pueden redirigirse.
Al ejecutar un comando, a veces se desea transmitir cierta información a otro comando o redirigir la salida a un fichero específico. Cada una de estas funcionalidades se discutirá en las siguientes dos secciones.
Redirección de E/S
La redirección de E/S permite al usuario redirigir información desde o hacia un comando mediante un fichero de texto. Como se describió anteriormente, la entrada, salida y error estándares puede redirigirse, y la información puede ser tomada de los archivos de texto.
Redirección de salida estándar
Para redirigir la salida estándar a un fichero, en lugar de la pantalla, es necesario usar el operador >
seguido del nombre del fichero. Si el fichero no existe, se creará uno nuevo; de lo contrario, el fichero existente se sobrescribirá.
Para ver el contenido del fichero recién creado, se puede usar el comando cat
. Por defecto, este comando muestra el contenido de un fichero en la pantalla. Consulte la página del manual para obtener más información sobre sus funcionalidades.
El siguiente ejemplo muestra la funcionalidad del operador. En primera instancia, se crea un nuevo fichero que contiene el texto “Hello World!”:
$ echo "Hello World!" > text $ cat text Hello World!
En la segunda invocación, el mismo fichero se sobrescribe con el nuevo texto:
$ echo "Hello!" > text $ cat text Hello!
Si se desea agregar nueva información al final del fichero, es necesario usar el operador >>
. Este operador también crea un nuevo fichero si no puede encontrar uno existente.
El primer ejemplo muestra la adición del texto. Como se puede ver, el nuevo texto fue agregado en la siguiente línea:
$ echo "Hello to you too!" >> text $ cat text Hello! Hello to you too!
El segundo ejemplo demuestra la creación de un nuevo fichero:
$ echo "Hello to you too!" >> text2 $ cat text2 Hello to you too!
Redirección de error estándar
Para redirigir solo los mensajes de error, un usuario deberá emplear el operador 2>
seguido del nombre del archivo en el que se escribirán los errores. Si el archivo no existe, se creará uno nuevo; de lo contrario, el archivo se sobrescribirá.
Como se explicó, el canal para redirigir el error estándar es channel 2. Al redirigir el error estándar, se debe especificar el canal, a diferencia de la otra salida estándar donde channel 1 está configurado por defecto. Por ejemplo, el siguiente comando busca un fichero o directorio llamado games
y solo escribe el error en el fichero text-error
, mientras muestra la salida estándar en la pantalla:
$ find /usr games 2> text-error /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games $ cat text-error find: `games': No such file or directory
Note
|
Para obtener más información sobre el comando |
Por ejemplo, el siguiente comando se ejecutará sin errores, por lo tanto, no se escribirá información en el fichero text-error
:
$ sort /etc/passwd 2> text-error $ cat text-error
Además de la salida estándar, el error estándar también se puede agregar a un fichero con el operador 2>>
. Esto agregará el nuevo error al final del fichero. Si el fichero no existe, se creará uno nuevo. El primer ejemplo muestra la adición de la nueva información en el fichero, mientras que el segundo ejemplo muestra que el comando crea un nuevo fichero porque no puede encontrar uno con el mismo nombre:
$ sort /etc 2>> text-error $ cat text-error sort: read failed: /etc: Is a directory
$ sort /etc/shadow 2>> text-error2 $ cat text-error2 sort: open failed: /etc/shadow: Permission denied
Usando este tipo de redirección, solo los mensajes de error serán redirigidos al fichero, la salida normal se mostrará en la pantalla o pasará por medio de la salida estándar o stdout.
Existe un archivo particular que técnicamente es un bit bucket (un archivo que acepta entrada y no hace nada con ella): /dev/null
. Es posible redirigir cualquier información irrelevante que no se desee mostrar o redirigir a un fichero importante, como se muestra en el siguiente ejemplo:
$ sort /etc 2> /dev/null
Redirección de entrada estándar
Este tipo de redirección se utiliza para pasar datos a un comando desde un fichero específico en lugar del teclado. En este caso, el operador <
se usa como se muestra en el ejemplo:
$ cat < text Hello! Hello to you too!
Generalmente la entrada estándar de redireccionamiento se usa con comandos que no aceptan argumentos de archivo. El comando tr
es uno de ellos. Este comando se puede usar para traducir el contenido del archivo modificando los caracteres de un archivo de formas específicas; como eliminar cualquier carácter particular, por ejemplo:
$ tr -d "l" < text Heo! Heo to you too!
Para obtener más información, consulte la página de manual de tr
.
Here documents
A diferencia de las redirecciones de salida, el operador <<
actúa de manera diferente en comparación con los otros operadores. Este flujo de entrada también se denomina Here Documents. Here Documents representa el bloque de código o texto que se puede redirigir al comando o al programa interactivo. Varios tipos de lenguajes de secuencias de comandos, como bash
, sh
y csh
pueden recibir información directamente desde la línea de comandos, sin utilizar ningún archivo de texto.
Como se puede ver en el siguiente ejemplo, el operador es usado para pasar datos al comando, mientras que siguiente argumento no especifica el nombre del fichero. Este argumento se interpreta como el delimitador de la entrada y no se tendrá en cuenta como contenido, por lo que cat
no la mostrará:
$ cat << hello > hey > ola > hello hey ola
Consulte la página del manual de cat
para encontrar más información.
Combinaciones
La primera combinación que se tratará combina la redirección de la salida estándar y la salida de error estándar al mismo archivo. Se utilizan los operadores &>
y &>>
, que representan la combinación de channel 1 y channel 2. El primer operador sobrescribirá el contenido existente del fichero y el segundo agregará la nueva información al final del fichero. Ambos operadores permitirán la creación del nuevo fichero si no existe, al igual que en las secciones anteriores:
$ find /usr admin &> newfile $ cat newfile /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games find: `admin': No such file or directory $ find /etc/calendar &>> newfile $ cat newfile /usr /usr/share /usr/share/misc ---------Omitted output---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games find: `admin': No such file or directory /etc/calendar /etc/calendar/default
Echemos un vistazo a un ejemplo usando el comando cut
:
$ cut -f 3 -d "/" newfile $ cat newfile share share share ---------Omitted output---------- lib games find: `admin': No such file or directory calendar calendar find: `admin': No such file or directory
El comando cut
corta los campos especificados del archivo de entrada usando la opción -f
; en nuestro caso, el tercer campo . Para que el comando encuentre el campo, se debe especificar un delimitador con la opción -d
. En nuestro caso el delimitador será el carácter /
.
Para obtener más información sobre el comando cut
, consulte su página de manual.
Tuberías (Pipes)
La redirección se usa principalmente para almacenar el resultado de un comando para ser procesado por otro. Este tipo de proceso puede volverse muy tedioso y complicado si se desea que los datos pasen por múltiples procesos. Para evitar esto, se puede vincular el comando directamente a través de tuberías o pipes. En otras palabras, la salida del primer comando se convierte automáticamente en la entrada del segundo. Esta conexión se realiza utilizando el operador |
(barra vertical):
$ cat /etc/passwd | less root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh :
En el ejemplo anterior, el comando less
después del operador |
modifica la forma en que se muestra el archivo. El comando less
muestra el contenido del fichero de texto permitiendo al usuario desplazarse hacia arriba y hacia abajo. less
también se usa por defecto para mostrar las páginas de manual, como se trató en las lecciones anteriores.
Es posible usar múltiples tuberías al mismo tiempo. Los comandos intermedios que reciben entrada y luego la cambian y producen salida se denominan filtros. Se utilizará el comando ls -l
para intentar contar el número de palabras de las primeras 10 líneas de la salida. Para hacer esto, es necesario usar el comando head
que por defecto muestra las primeras 10 líneas de un archivo y luego cuenta las palabras a través del comando wc
:
$ ls -l | head | wc -w 10
Como se mencionó anteriormente, por defecto, head
solo imprime en pantalla las primeras 10 líneas del fichero de texto especificado. Este comportamiento puede modificarse mediante el uso de opciones específicas. Consulte la página del manual de head
para más información.
Existe otro comando que muestra el final de un archivo: tail
. Por defecto, este comando selecciona las últimas 10 líneas y las imprime en pantalla, y al igual que head
el número se puede modificar. Consulte la página de manual de tail
para más detalles.
Note
|
La opción |
Por defecto, el comando wc
(Word count) cuenta las líneas, palabras y bytes de un archivo. Como se muestra en el ejercicio, la opción -w
hace que el comando solo cuente las palabras dentro de las líneas seleccionadas. Las opciones más comunes que puede usar con este comando son: -l
, que solo cuenta las líneas, y -c
, que se usa para contar solo los bytes. Se pueden encontrar más variaciones y opciones del comando, así como más información sobre wc
en la página del comando man.
Ejercicios guiados
-
Liste el contenido del directorio actual, incluyendo la propiedad y los permisos, y redirija la salida a un fichero llamado
contents.txt
dentro del directorio home del usuario. -
Ordene el contenido del archivo
contents.txt
de su directorio actual y añádalo al final de un nuevo archivo llamadocontents-sorted.txt
. -
Muestre las últimas 10 líneas del fichero
/etc/passwd
y rediríjalas a un nuevo fichero en el directorioDocuments
de su usuario. -
Cuente el número de palabras dentro del fichero
contents.txt
y agregue la salida al final del ficherofield2.txt
en su directorio home. Deberá utilizar la redirección de entrada y salida. -
Muestre las primeras 5 líneas del fichero
/etc/passwd
y ordene la salida en orden alfabético. -
Usando el fichero
contents.txt
creado anteriormente, cuente el número de caracteres de las últimas 9 líneas. -
Cuente la cantidad de ficheros llamados
test
dentro del directorio/usr/share
y sus subdirectorios. Nota: cada salida de línea del comandofind
representa un fichero.
Ejercicios exploratorios
-
Seleccione el segundo campo del fichero
contents.txt
y redirija la salida estándar y la salida de error a otro fichero llamadofield1.txt
. -
Usando el operador de redirección de entrada y el comando
tr
, elimine los guiones (-
) del ficherocontents.txt
. -
¿Cuál es la mayor ventaja de solo redirigir errores a un fichero?
-
Reemplace todos los espacios recurrentes por un solo espacio dentro del fichero
contenidos.txt
ordenado alfabéticamente. -
En una sola línea de comandos, elimine los espacios recurrentes (de la misma forma que en el ejercicio anterior), seleccione el noveno campo y ordénelo alfabéticamente sin distinción entre mayúsculas y minúsculas. ¿Cuántos pipes necesitó?
Resumen
En esta lección, usted aprendió:
-
Tipos de redirección
-
¿Cómo usar los operadores de redirección?
-
¿Cómo usar tuberías para filtrar la salida de comandos?
Comandos usados en esta lección:
cut
-
Elimina secciones de cada línea de un fichero.
cat
-
Muestra o concatena ficheros.
find
-
Busca ficheros en una jerarquía de directorios.
less
-
Muestra el contenido de un fichero, lo que permite al usuario desplazarse línea a línea.
more
-
Muestra el contenido de un fichero, página a página.
head
-
Muestra las primeras 10 líneas de un fichero.
tail
-
Muestra las últimas 10 líneas de un fichero.
sort
-
Ordena ficheros.
wc
-
Cuenta de forma predeterminada las líneas, palabras o bytes de un fichero.
Respuestas a los ejercicios guiados
-
Liste el contenido del directorio actual, incluyendo la propiedad y los permisos, y redirija la salida a un fichero llamado
contents.txt
dentro del directorio home del usuario.$ ls -l > contents.txt
-
Ordene el contenido del archivo
contents.txt
de su directorio actual y añádalo al final de un nuevo archivo llamadocontents-sorted.txt
.$ sort contents.txt >> contents-sorted.txt
-
Muestre las últimas 10 líneas del fichero
/etc/passwd
y rediríjalas a un nuevo fichero en el directorioDocuments
de su usuario.$ tail /etc/passwd > Documents/newfile
-
Cuente el número de palabras dentro del archivo
contents.txt
y agregue la salida al final de un archivofield2.txt
en su directorio de inicio. Deberá utilizar la redirección de entrada y salida.$ wc < contents.txt >> field2.txt
-
Muestre las primeras 5 líneas del fichero
/etc/passwd
y ordene la salida en orden alfabético.$ head -n 5 /etc/passwd | sort -r
-
Usando el archivo
contents.txt
creado anteriormente, cuente el número de caracteres de las últimas 9 líneas.$ tail -n 9 contents.txt | wc -c 531
-
Cuente la cantidad de ficheros llamados
test
dentro del directorio/usr/share
y sus subdirectorios. Nota: cada salida de línea del comandofind
representa un fichero.$ find /usr/share -name test | wc -l 125
Respuestas a los ejercicios exploratorios
-
Seleccione el segundo campo del fichero
contents.txt
y redirija la salida estándar y la salida de error a otro fichero llamadofield1.txt
.$ cut -f 2 -d " " contents.txt &> field1.txt
-
Usando el operador de redirección de entrada y el comando
tr
, elimine los guiones (-
) del ficherocontents.txt
.$ tr -d "-" < contents.txt
-
¿Cuál es la mayor ventaja de solo redirigir errores a un fichero?
La redirección de errores a un fichero puede ayudar a mantener un fichero de registro que se supervise con frecuencia.
-
Reemplace todos los espacios recurrentes por un solo espacio dentro del fichero
contenidos.txt
ordenado alfabéticamente.$ sort contents.txt | tr -s " "
-
En una línea de comando, elimine los espacios recurrentes (como se hizo en el ejercicio anterior), seleccione el noveno campo y ordénelo alfabéticamente y sin distinción entre mayúsculas y minúsculas. ¿Cuántas "pipes" tuviste que usar?
$ cat contents.txt | tr -s " " | cut -f 9 -d " " | sort -fr
El ejercicio usa 3 "pipes", uno para cada filtro.