#4sysadmins

Inicio » LPIC-1 Capítulo 1

LPIC-1 Capítulo 1

EN ESTE CAPÍTULO SE ABARCAN LOS SIGUIENTES OBJETIVOS DEL EXAMEN:

  • 103.1: Trabajar desde la línea de comandos (4)
  • 103.2: Procesar flujos de texto mediante filtros (3)
  • 103.4: Uso de flujos, pipes, y redirecciones (4)
  • 103.7: Buscar archivos de texto mediante expresiones regulares (2)

 

Herramientas básicas para la línea de comandos Linux

A lo largo de este capítulo veremos que es la consola de Linux, algunas de sus variantes y como utilizarla. Se nombrarán muchos de los comandos con los que un administrador de sistemas debe de estar familiarizado, ya que ocuparán gran parte de su jornada laboral en cuanto a la administración de un sistema GNU/Linux. Aprenderemos como movernos por el shell, por ejemplo para buscar ayuda sobre la utilización de un comando concreto, la instalación de un programa o el formato de su archivo de configuración. Para terminar, cerraremos el capítulo con algunos metacaracteres importantes del shell, los posibles atajos del teclado que nos facilitarán la interacción con la consola y como no, el uso de expresiones regulares con las que podremos manipular archivos y en concreto el flujo de texto.

La Shell

El shell es un programa mas del operativo cuya función es la de leer e interpretar los comandos que en ella se teclean y ejecutan, que a su vez son “miniprogramas” que interactúan con el sistema operativo, es decir, el Shell es una especie de frontend que nos permite comunicarnos con el sistema operativo GNU/Linux. El shell ofrece un lenguaje de programación interpretado con el que poder escribir, modificar y verificar programas rápidamente y de una forma sencilla. La programación Shell es una parte fundamental de la administración de sistemas basados en UNIX, ya que mediante el uso de las herramientas (comandos) que nos ofrece el operativo, estructuras condicionales, bucles, funciones, variables, etc… podremos automatizar una gran parte de procesos rutinarios del sistema, como por ejemplo respaldar archivos, verificar procesos, creación de usuarios y grupos, notificarnos acciones concretas que se realicen en el sistema y cual ha sido su resultado, etc… Existen diferentes consolas con las que podremos trabajar en un sistema UNIX. No obstante durante el curso que ofrece esta guía de estudios nos centraremos en el Shell Bash (Bourne Again Shell), ya que por defecto es la consola que se instala en la mayoría de distribuciones GNU/Linux.

Las consolas mas comunes en Linux.

  • bsh (Bourne Shell): Shell original de UNIX creado a mediado de los 70’s por Stephen R. Bourne. Su nombre de archivo es /bin/sh y en los OS Linux suele ser un enlace simbólico a bash. Algunas de sus características podrían ser:
    • Control de procesos.
    • Control de flujo de entrada y salida (I/O)
    • Uso de expresiones regulares, variables y funciones.

Por contra, bourne shell carece de autocompletado de nombres de archivos, directorios y comandos (uso del tabulador), no contiene un historial de comandos y posee dificultades para la ejecución de varios procesos en background.

 

  • csh (C Shell): La consola C original. No se usa (normalmente). Adiciona algunas características de funcionalidad con respecto a bsh como el historial de comandos y un mejor control de procesos.

 

  • tcsh: Basada en la antigua consola csh, es bastante popular en Linux aunque no es la consola por defecto. Difiere en algunos aspectos a bash. Ofrece complexión de comandos y nombres.

 

  • ksh (Korn Shell): Escasos usuarios, pero fieles. Diseñada para tener lo mejor de bsh y csh (Bourne y C)

 

  • bash (Bourne Again Shell): Desarrollado por el proyecto GNU y basado en la consola Bourne de UNIX. Es la mas común entre los OS Linux (reemplazado al antiguo bsh /bin/sh). Ofrece características de C Shell (csh), Korn Shell (ksh) y bsh. Podríamos nombrar algunas como:
    • Autocompletado de nombres de archivos, directorio, variables, usuarios, comandos y nombre de máquinas.
    • Corrección de rutas de archivos y directorios mediante el comando cd
    • Aritmética de enteros y soporte para Arrays de tamaño ilimitado.

 

  • zsh: Consola Z. Va aún mas allá de Korn, incorporando nuevas funcionalidades y mejoras.

 

Diferencia entre comandos internos y externos del bash

Lo normal de un sistema GNU/Linux es que este posea instalado un gran número de programas o comandos útiles para el buen funcionamiento y administración del sistema. Podremos encontrar tanto comandos internos como comandos externos:

  • Los comandos internos son los que vienen integrado con la consola (man bash, para conocer los de bash) algunos de ellos pueden ser: cd, pwd, echo, exec, time, set, exit
  • Los comandos externos son aquellos que aún viniendo instalados (o no) en el sistema, necesitan que la ruta en la que se encuentran instalados (por ejemplo /usr/bin, /usr/local/sbin, /usr/games, etc…) sea referenciada en el valor de la variable PATH del usuario. Solo de esta forma bash localizará al comando y posteriormente lo ejecutará.

Los comandos internos y externos tienen comportamientos diferentes y pueden aceptar parámetros diferentes. Por ejemplo con respecto a los enlaces simbólicos (archivos que apuntan a otros archivos o directorios, parecidos a los accesos directos de Windows). Si utilizamos el comando interno pwd (muestra el directorio de trabajo actual) estando situados en un enlace simbólico, este mostrará la ruta “destino” del enlace, es decir en vez del directorio en el que estamos situado, imprimirá la ruta de aquel directorio a la que en realidad apunta el enlace simbólico. Por su parte el comando externo pwd, mostrará el origen, es decir la propia ruta del enlace simbólico. Advertencia: La cuenta root JAMAS debe de tener en su variable PATH la ruta de directorio actual (./), y con respecto a los usuarios, en caso de que sea necesario, deberá de ir al final del PATH.

Uso de variables

Las variables son “nombres” que utiliza el Shell (en este caso) para almacenar un valor, de manera que cuando llamemos a esa variable en realidad lo que estaremos haciendo será pedir un cierto valor que necesitaremos (en este caso, necesitará el Shell) para realizar una determinada acción. Por ejemplo comentábamos antes la importancia de añadir a la variable PATH el valor de una ruta en la que cabe la posibilidad de que se encuentre un programa que necesitaremos ejecutar sea cual sea nuestro directorio de trabajo, pero… ¿por qué hay que añadirlo a la variable PATH? pues porque cuando invocamos a un comando, la Shell por defecto busca si ese comando pertenece a si misma, es decir se trata de un comando interno, de lo contrario necesitará ciertas rutas en las que poder localizar este comando. Estudiaremos mas sobre las variables en el capítulo destinado a la administración y configuración de la Shell pero es importante saber que para que la Shell haga uso de una variable, antes deberemos de exportarla.

  • Exportar una variable desde la línea de comandos:
$ export NOM_VAR=valor_variable
  • Comprobar el valor de una variable desde la línea de comandos:
$ echo "$NOM_VAR"

 

Algunos metacaracteres útiles de shell

Cuando comencemos a interactuar con la Shell o crear pequeños programas para automatizar una tarea concreta (shell scrip) nos vendrá bien conocer algunos metacaracteres que nos sirvan para enlazar acciones. Por ejemplo podremos utilizar el metacaracter ‘||‘ (barra barra) para representar un OR lógico, ‘&&‘ para representar un AND o ‘;‘ para separar dos comandos.

  • Ejecutar un listado del directorio /home/agomez o mostrar el mensaje “El usuario no existe” en caso de que el listado devuelva código de error:
$ ls -lt /home/agomez || echo "El usuario no existe"
  • Listar el mismo contenido que en el ejemplo anterior, pero si el usuario existe mostraremos un “OK, directorio listado”:
$ ls -lt /home/agomez && echo "OK, directorio listado"
  • Ahora simplemente vamos a enlazar tres comandos. Se ejecutarán en orden secuencial, hasta que no termine uno, no comenzará el otro:
$ date; sleep 10;cal

 

Buscar ayuda dentro del Shell

Linux posee diferentes ‘canales’ para buscar ayuda de forma local sobre la utilización de sus comandos o incluso mini manuales para realizar una tarea concreta, estamos hablando de las páginas de manuales, de extractos de información o pequeños tutoriales que nos harán la vida mas fácil dentro de un sistema Línux y en concreto con su línea de comandos o shell.

  • Páginas man: Las páginas man son archivos de manuales que se encuentran en formato comprimido y localizadas normalmente en el directorio /usr/lib/man o /user/share/man. Para acceder a las páginas de manuales bastará con escribir $man <comando> y se desplegarán mediante un paginador (more o less). Las páginas man suelen estar estructurada por secciones normalmente:
    • NOMBRE
    • SIPNOSIS
    • DESCRIPCIÓN
    • OPCIONES
    • VEA TAMBIÉN
    • DIAGNÓSTICOS
    • ARCHIVOS
    • ERRORES/BUGS
    • HISTORIA
    • AUTOR

No todas las páginas man cuentan con estas secciones. Podemos buscar ayuda para man desplegando man $man man

  • info: Con el comando info podremos leer la documentación de una forma mas fácil que la mostrada por las páginas man. La navegación por la información dada por info suele ser un poco mas complicada, pero si nos encontramos con la info de un comando o utilidad que presenta un menú, podremos pulsar ‘m’ e introducir el nombre de la sección del menú a la que queremos acceder o ‘h’ si necesitamos ayuda para movernos por la página.
  • HOWTOs: Son documentos detallados que describen métodos para realizar ciertas tareas, como por ejemplo la configuración de un dispositivo. Un documento HOWTO suele cubrir un tema complejo y por ello tienden a ser extensos. Estos documentos suelen encontrarse bajo el directorio /usr/share/doc/utilidad/howto y normalmente podremos abrirlo con nuestro navegador preferido.
  • FAQ: Preguntas mas frecuentes. Como su nombre indica son documentos en los que se detallan las respuestas a las preguntas mas frecuentes que surgen sobre distintas utilidades, comandos o métodos para realizar ciertas tareas. Estos documentos igualmente podremos abrir en su mayor parte con el navegador y localizarlos bajo /usr/share, quizás necesitemos hacer una búsqueda con find para ser mas precisos.

Linux nos ofrece otras dos herramientas de búsqueda de información que en realidad lo que hacen es derivar su información de las páginas de manual anteriormente mencionadas. Estas herramientas son whatis y apropos. Estos comandos aceptan como argumentos nombres de comandos o expresiones (-r) y wildcards (-w) para buscar en las descripciones de las páginas man y mostrar las páginas man que contienen el patrón. Si usamos ambas herramientas sin opciones apropos suele ofrecer mas resultados ya que no precisa del nombre exacto del comando, es decir si hacemos un whatis passwd y un apropos passwd, whatis se limitará a resultados exactos para passwd mientras que apropos mostrará las páginas man de otros comandos como por ejemplo gpasswd o chgpasswd. Ambas herramientas tienen su símil con el comando man acompañado de opciones, por ejemplo whatis es igual a man -f mientras que apropos es igual a man -k. Conclusión: Podemos usar man -f o whatis cuando queramos localizar las páginas man existentes para un determinado comando, mientras que apropros y man -k servirán cuando no recordemos el nombre de un comando y podamos ir averiguarlo mediante patrones. También disponemos de pequeños mini tutoriales y FAQ en html, así como información detallada a través del comando info.

Comandos GNU/Linux

En esta sección del capítulo estudiaremos los comandos mas básicos del Shell de GNU/Linux, aquellos con los que un administrador de sistema debe estar totalmente familiarizado.

Comandos para la ayuda de otros comandos

Si queremos obtener información sobre la utilización de un comando, podemos hacerlo a través de man (manual) el cual desplegará a través de un paginador (more o less) toda la información relativa al comando. No obstante con man podremos además de informarnos sobre un comando, aprender el formato de un archivo de configuración o los archivos de dispositivos. Esto es posible gracias a que man esta dividido en secciones, siendo la sección uno (la sección por defecto) la relativa a los programas ejecutables y comandos de consola, la sección cinco al formato de los archivos de configuración o la sección cuatro para los archivos de dispositivos. Si queremos conocer todas sus secciones y como utilizar man, podremos pedir ayuda sobre el mismo a través de:

$ man man

Si queremos abrir una sección concreta lo haremos así:

$ man 5 passwd

De esta manera en vez de abrir la información sobre el comando passwd, se desplegará aquella que muestra el formato y características del archivo /etc/passwd. Otros comandos con los que podremos encontrar información sobre comandos son help e info. Nota: Si queremos conocer otros comandos de comandos o informarnos sobre el uso de estos, podremos ir a la sección de comandos de este mismo tema: Comandos para la ayuda de otros comandos

Canalizadores y redirecciones

Gracias a una serie de caracteres podremos desviar la información de entrada o salida del Shell a distintos archivos, dispositivos o pantallas. Por ejemplo imaginemos que queremos almacenar la salida del comando ls (list) en un archivo de manera que posteriormente se lo podamos enviar a un tercero para que estudie tranquilamente el contenido del directorio. Para conseguir esto basta con utilizar el caracter ‘>‘.

$ ls -lt /home/agomez/Documentos/ > listado-documentos.txt

Con el comando anterior creamos “listado-documento.txt” en caso de no existir y/o machacaremos su contenido si ya existiese dicho archivo. Si no queremos machacar el contenido podremos usar ‘>>‘ de manera que si no existe el archivo, se creará y si ya existe solo el nuevo contenido será añadido al ya existente. De la misma manera que creamos o añadimos contenido en un archivo a partir de la salida de un comando (lo que estamos haciendo es reenviar lo que se debería de mostrar por la salida estándar stdout hacia un archivo, es decir modificamos la stdout) podemos redireccionar la salida de error (stderr) usando el descriptor 2 de la siguiente manera:

$ cat /home/agomez/Documentos/contabilidad.txt 2> stderr-contabilidad.txt

De esta manera si se produjese un error al desplegar el contenido de “contabilidad.txt“, este se almacenaría en el archivo “stderr-contabilidad.txt“. Podemos emplear 2>> de la misma manera que >>, es decir añadiendo contenido en vez de reemplazando. Igual que modificamos la stdout podemos modificar la entrada estándar (stdin) con el caracter ‘<‘. Por ejemplo imaginemos que tenemos un archivo “guia.txt” cuyo contenido corresponde a una guía telefónica la cual tenemos desordenada. Para ordenar esta guía podríamos hacer que la entrada estándar del comando sort (ordena) fuese en vez del teclado, este archivo. De esta manera la salida de sort será el contenido del archivo “guía.txt” pero ordenado. Otra redirección muy útil es el caracter ‘|‘ que mas que una redirección se trata de un canalizador, tubería o pipe. Lo que hace esta pipe es enlazar la salida de un comando de manera que sea la entrada de otro. Por ejemplo podríamos desplegar el contenido de un archivo desordenado y que directamente fuese la entrada al comando sort de manera que este lo ordene y lo despliegue ordenado:

$ cat desordenado.txt | sort

Si además queremos conservarlo en otro archivo:

$ cat desordenado.txt | sort > ordenado.txt

Podemos aprender mas sobre las redirecciones y canalizadores, además de otros comandos como tee, xargs o exec en el apartado de comandos: Redirecciones y canalizadores

Comandos para combinar archivos

Existen ciertos comandos que nos facilitarán el tratamiento de archivos, sort podría ser uno de ellos, aunque en esta sección solo nombraremos a cat, join y paste. El comando cat es útil si queremos desplegar el contenido de uno o varios archivos, bastará con pasárselos como argumento. Otro utilitario importante de cat es cuando queremos almacenar el contenido de varios archivos en solo uno. Para ello solo deberemos de pasarlos como argumentos a cat y terminar redireccionando a un archivo único tal que así:

$ cat primero.txt segundo.txt tercero.txt > todos.txt

Nota: Si queremos realizar la acción de desplegar archivos o añadirlos a otro pero de forma inversa, usaremos el comando tac. join por su parte combina archivos pero a partir de una columna en común. Para ello los archivos deberán de estar previamente ordenados (podremos usar sort para esto), y paste desplegará el contenido de varios archivos pero paralelando sus columnas. Por ello ambos archivos deberán de tener el mismo número de líneas. Podemos recurrir a las páginas man de estos comandos o a Comandos para combinar archivos para obtener mas información.

Comandos para la transformación de archivos

Existen multitud de comandos para lograr transformar un archivo, todo dependerá de las modificaciones que queramos realizar sobre ellos. Por ejemplo si lo que queremos es convertir una tabulación en espacios (una tabulación equivale a ocho espacios por defecto) utilizaremos el comando expand, mientras que si queremos obtener el resultado opuesto, es decir convertir ocho espacios en una tabulación (comprimiremos el archivo) utilizaremos unexpand. Ya hemos visto que el comando sort puede realizar transformaciones en archivos, por ejemplo modificando su contenido de forma que quede en un determinado orden. Un comando importante cuando tenemos archivos demasiado grandes es split con el que podremos dividir un archivo en varias partes. Por ejemplo podremos utilizar su opción -b para dividirlo según una cierta cantidad de bytes o -l para dividir por líneas. Otro comando con el que podremos comprimir un archivo, mas bien reducirlo de tamaño para que al ser impreso utilice un menor número de hojas es mpage, que lee archivos en texto plano o en formato PostScript y les aplica un cierto formato reduciendo el tamaño por páginas. Para terminar, nombraremos los comandos tr, con el que podremos convertir caracteres de un archivo (por ejemplo algunas mayúsculas por minúsculas, ciertas letras por otras, utilizar grupos de letras, etc..), unique, con el que poder eliminar líneas duplicadas en un archivo, o iconv para modificar la codificación de un archivo. Ir a las páginas man de los respectivos comandos o a Comandos para la transformación de archivos para saber mas sobre su uso.

Comandos para dar formatos a archivos

Algunos de los comandos con los que podremos dar formato a un archivo son:

  • fmt : Da formato a los archivos que tienen líneas exageradamente largas, longitudes de líneas irregulares ,etc… Podremos utilizar su opción -w para limitar el ancho (en caracteres) de la línea.
  • nl : Nos permite enumerar las líneas de un archivo de forma sofisticada/compleja. Algunas de sus opciones más básicas serían, -a para enumerar todas las líneas, -t para enumerar solo las líneas vacias, -n para ocultar el número de líneas (útil por ejemplo en encabezados o piés de páginas) o pPATRÓN para enumerar solo las líneas que contengan a PATRÓN. Podemos justificar un texto mediante el uso de formatos como nl para justificar a la izquierda o rn justificar a la derecha.
  • pr : Prepara un archivo para su impresión añadiendo encabezados (con fecha y hora actual, nombre del archivo y número de página), pies, etc… Acepta opciones como -t para eliminar el encabezado, definir un ancho de página (según caracteres) -w, definir la longitud de la página -l o, -o para definir un margen izquierdo.

Nota: Mas información sobre estos comandos en Comandos para dar formatos a archivos o en sus respectivas páginas man.

Comandos para la mensajería desde la línea de comandos

Tenemos la posibilidad de utilizar una serie de programas/comandos para enviar y recibir mensajes a determinados (o a todos) usuarios conectados a un sistema (local o remoto), y que se encuentran con una sesión de consola abierta. Mediante el comando wall enviaremos un mensaje a todos los usuarios conectados al sistema. Si lo que queremos es enviar un mensaje a la consola de un determinado usuario conectado al mismo sistema utilizaremos write. Podemos activar o desactivar los mensajes recibidos en una consola a través de write mediante el comando mesg, para ello deberemos de utilizar una línea como la siguiente:

  • Bloquear los mensajes entrantes por la terminal cuatro (pts4):
$mesg n < /dev/pts/4
  • Volver a activar los mensajes en esta misma terminal:
$mesg y < /dev/pts/4

Otros comandos son echo y talk. Con echo nos enviaremos a nosotros mismos un mensaje. En realidad mas que mandarnos un mensaje lo que hace echo es desplegar el texto escrito entre comillas por la salida estándar. Con talk mantendremos una conversación bidireccional con otro usuario (tipo chat). Mas sobre estos comandos en Comandos para la mensajería desde línea de comandos

Comandos para la visualización de archivos

Para visualizar el contenido de los archivos, ya hemos mencionado el comando cat. No obstante existen otros con mayor utilidad, o mejor dicho enfocados principalmente a la lectura de documentos. Estos comandos son tail, head, more y less. Con tail y head podremos desplegar las últimas, o primeras líneas (respectivamente) de un documento. Muy útil para la visualización de logs. Por ejemplo si queremos ver las últimas diez líneas (número de líneas por defecto) escritas en un archivo de de registro, bastará con pasarle el nombre del archivo al comando tail. Si en cambio lo que necesitamos es ver las cuatro primeras líneas de un archivo de configuración, bastará con pasarle la opción -n y el número de líneas, mas el nombre del archivo al comando head. more y less son los paginadores que normalmente utilizaremos para visualizar archivos. Estos paginadores nos permiten movernos por la pantalla con los cursores ademas de poder avanzar o retroceder páginas con tan solo pulsar las teclas destinadas a ello. more es una versión anterior a less por lo que muchas de las opciones de less no funcionarán en more. Las páginas man de los comandos utilizan normalmente el paginador less por defecto para mostrarnos el contenido del manual.

Comandos para resumir archivos

En realidad lo que nos permiten hacer los siguientes comandos, mas que resumir archivos es ofrecernos una “porción” de ellos según que opciones utilicemos o desplegarnos información sobre el archivo. Veremos esto fácilmente con los siguientes ejemplos.

  • Imprimir tan solo las dos primeras letras de cada línea de un archivo, para lo que utilizaremos el comando cut:
$ cut -c -2 archivo.txt

Nota: Podríamos haber utilizado 1-2 en lugar de -2. n representa desde 1 a n, mientras que n significa que muestre desde n a último.

  • Tenemos un archivo con los nombres y primer apellido de una serie de usuarios (uno por línea) separados por un espacio. Vamos a mostrar tan solo el primer apellido, lo que correspondería con el segundo campo de la línea (el primer campo sería el nombre). Por defecto cut utiliza el tabulador como delimitador de campo, por lo que tendremos que asignar el espacio ” “ como nuevo delimitador:
$ cut -d " " -f2 apellidos.txt
  • Si lo que queremos es mostrar ciertas características de un archivo, como el número de línea, cuantas palabras o caracteres contiene, etc… usamos el comando wc. Vamos a mostrar el número de líneas del archivo apellidos, así veremos cuantos usuarios tenemos registrado:
$ wc -l apellidos.txt

Importante: Estos comandos suelen usarse normalmente como parte de una cadena de comandos separados por pipes. Como hasta ahora, si queremos aprender mas, visitaremos las páginas man de estos dos comandos o bien Comandos para resumir archivos

Complexión de comandos y atajos de teclado

  • Limpiar la pantalla: CTRL + L (igual al comando clear)
  • Retroceder media pantalla: SHIFT + Re Pág
  • Avanzar media pantalla: SHIFT + Av Pág
  • Desplazarnos una palabra a la izquierda: CTRL + Flecha izq. / Esc + B
  • Desplazarnos una palabra a la derecha: CTRL + Flecha Der. / Esc + F
  • Desplazarnos al inicio de una línea: CTRL + A
  • Desplazarnos al final de una línea: CTRL + E
  • Borrar un carácter (el que está sobre el cursor): CTRL + D / Supr
  • Eliminar la última palabra escrita: CTRL + W
  • Borrar todo el texto entre el cursor y el final de linea: CTRL + K
  • Borrar todo el texto entre el cursor y el principio de linea: CTRL + U
  • Intercambiar o desplazar la letra anterior al cursor un carácter hacia adelante: CTRL + T
  • Intercambiar o desplazar la palabra anterior al cursor una palabra hacia adelante: Esc + T ; González Mesas, si el cursor está en la M y pulsamos Esc+T ahora quedará Mesas González.
  • Cambiar de minúsculas a mayúsculas los caracteres que hay entre el cursor y el final de la palabra: Esc + U
  • Cambiar de mayúsculas a minúsculas los caracteres que hay entre el cursor y el final de la palabra: Esc + L
  • Cambiar a mayúscula la letra que hay sobre el cursor, si el cursos está en el espacio, se cambiará la primera letra de la siguiente palabra: Esc + C
  • Limpiar el historial: history -c
  • Buscar comando en el historial hacia arriba (comandos mas antiguos): Flecha arriba / CTRL + P
  • Buscar comandos en el historial hacia abajo (comandos mas nuevos): Flecha abajo / CTRL + N
  • Buscar comandos en el historial por caracteres: CTRL-R y escribo caracteres (vuelvo a pulsar CTRL + R para recorrer la lista de comandos que contienen esos caracteres), CTRL-G para salir de la búsqueda
  • Ejecutar un comando del historial conociendo su número en la lista: !210
  • Abrir un editor de texto: CTRL + X + CTRL + E

 

Uso de expresiones regulares

Las expresiones regulares son patrones con una sintaxis específica utilizadas para igualar cadenas de caracteres, ya sea desde la ausencia de caracter, a uno o mas caracteres. Las expresiones regulares se utilizan con diferentes herramientas de Linux ya sea para buscar dentro del contenido de un archivo especifico mediante un editor de texto, buscar con comandos como grep o sed dentro de un archivo para procesar líneas o incluso con comandos como find para localizar archivos en el disco. A continuación veremos algunos caracteres especiales o agrupaciones de ellos con los que deberemos de estar familiarizado para hacer un buen uso de las expresiones regulares.

Metacaracteres y rangos

  • \ : Sirve para escapar un caracter especial dentro de una expresión regular

Ejemplo: . (punto) hace referencia a cualquier caracter, \. hace referencia a “.” (punto)

  • / : Sirve para acotar una expresión regular:

Ejemplo: /expresión regular/

  • ^ : Indica que la línea comienza con un determinado caracter. Dentro de corchetes y al principio su significado es de inversión.

Ejemplo:   ^a la línea comienza con el caracter ‘a‘,   [^a] la línea comienza con cualquier caracter menos con ‘a

  • $ : Indica que el final de línea termina con un determinado caracter.
  • . (punto) : Hace referencia a cualquier carácter, pero solo a 1. No incluye el salto de línea.
  • ? : Hace referencia a 0 o 1 carácter. En expresiones regulares también puede representar la opcionalidad de aparición de uno o varios caracteres.
  • + : Referencia a 1 o mas caracteres
  • * : Refiere a 0 o mas caracteres
  • [] : Referencia a un conjunto de caracteres (expresiones entre corchetes) o rango ( expresiones de rango).

Ejemplo:   c[ao]ma (cama o coma),   c[1-2A-Z]ma (c2ma, c1-ma, cIma, cLma…)

  • () : Al igual que con expresiones aritméticas, sirve para agrupar una parte de la expresión
  • | : Significa opción ‘OR’.

Ejemplo:   cama|coma , la posibilidad de concordar con cama o coma dentro de un texto

  • {} : Indica un rango de repetición.

Ejemplo:   r{1,2} indica 1 o 2 concurrencias de r

  • [:alnum:] : rango alfanumérico. Equivale a [0-9a-zA-Z] incluso es mas apropiado, pues no depende de la codificación del archivo.
  • [:alpha:] : rango alfabético [a-zA-Z]
  • [:digit:] : Dígitos [0-9]
  • [:xdigit:] : Dígitos hexadecimal
  • [:lower:] : Minúsculas
  • [:upper:] : Mayúsculas
  • [:space:] : Espacios
  • [:print:] : Imprimibles
  • [:graph:] : Gráficos

 

Diferencias entre expresiones regulares básicas y extendidas

La diferencia entre expresiones básicas y extendidas es simple”, las expresiones básicas no hacen uso de caracteres especiales como ?,+,|, (), {}… por lo que su utilidad se ve disminuida.

Algunos ejemplos de expresiones regulares

  • [0-9]* : Cadena vacía, 1, 43, 6542, etc…
  • ^.*$ : Cualquier línea completa
  • [ab]* : a, aaaaaa, aa, bb, b, bbbb….
  • (ab)* : a, b, ba, ab, bababa, abab, aaaaabbbbabab…
  • ^[0-9]?b : Puede o no (?) empezar por un dígito o por b. Ejemplo 3b, b, 0b…
  • ([0-9]+ab)* : El * fuera del paréntesis indica que puede existir una cadena vacia dentro del parentesis, también infinitas a y b, pero el + del corchete obliga a que haya uno o mas digitos númericos. Ejemplo: cadena vacia, 023a, 1aa34bbaa23….
  • /^#/ : Cualquier línea que comience por #
  • /^$/ : Cualquier línea en blanco
  • /}$/ : Cualquier línea que termine con }
  • /} *$/ : Cualquier línea que termine con } y tenga 0 o mas espacios

 

Comandos útiles en expresiones regulares: grep y sed

 

grep

El comando grep (Global Regular Expresion Print) busca un patrón o cadena simple de caracteres dentro del contenido de un archivo. grep no efectúa cambios en el archivo simplemente despliega a pantalla cada línea del archivo que contiene o iguala el patrón de búsqueda. Existen otros dos comandos relacionados con grep que en realidad no son mas que un ‘front end‘ de dos de las opciones que se le pueden pasar a grep, estos son egrep (grep -E) y fgrep (grep -F). Las diferencias son algunas como por ejemplo el uso de expresiones regulares en grep, permitiéndonos egrep utilizar expresiones extendidas, además de una ligera diferencia en la sintaxis del comando. Por su parte fgrep utiliza cadenas simple de caracteres en vez de expresiones regulares. Estudiaremos el uso de estos comandos en el apartado de comandos de este mismo capítulo. No obstante dejaremos un ejemplo del uso simple de cada uno de ellos:

  • Localizar con grep la palabra ‘computación’ en el archivo “Fundamentos sobre Sistemas Operativos.odt
$ grep computación "Fundamentos sobre Sistemas Operativos.odt"
  • Aquí vamos a complicar la cosa solo para mostrar que con egrep es posible utilizar caracteres especiales formando expresiones entendidas, algo que con grep sin su opción -E no sería posible. Vamos a suponer que tenemos un archivo de red con la siguiente información(*) y queremos listar las líneas 2 y 3 (insisto que como casi siempre esto se podría haber realizado de manera mas simple, pero está realizado así para identificar diferentes caracteres especiales):
 $ cat red.txt
eth0 Link encap:Ethernet HWaddr 88:ae:1d:69:5a:5a 
 inet addr:192.168.1.33 Bcast:192.168.1.255 Mask:255.255.255.0
 inet6 addr: fe80::8aae:1dff:fe69:5a5a/64 Scope:Link
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
 RX packets:273267 errors:0 dropped:0 overruns:0 frame:0
 TX packets:174060 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:1000 
 RX bytes:350125144 (350.1 MB) TX bytes:24182345 (24.1 MB)
 Interrupt:16
$ egrep "^ *inet *[a-z]*:[0-9]*(192.168)|^ *inet6" red.txt
 inet addr:192.168.10.13 Bcast:192.168.10.255 Mask:255.255.255.0
 inet6 addr: fe80::8bbj:1dcf:fe96:5h5h/64 Scope:Link
  • Localizar con fgrep el nombre y apellido de un determinado alumno en el archivo alumnos.txt
$ fgrep "Julio Ortiz" alumnox.txt
Julio Ortiz Maldonado

 

sed

Stream EDitor, es un editor de línea no interactivo. Útil para procesar textos extendidos. El comando sed trata el contenido de los archivos pero al igual que grep no los modifica. No obstante podemos redirigir el contenido modificado a un archivo haciendo permanente estos cambios. El comportamiento por defecto de sed es imprimir todas las líneas procesadas se hayan “aplicado” cambios o no, evidentemente este comportamiento puede ser modificado mediante opciones de sed. Sed tiene sus propios comandos que serán los encargados de ejecutar una acción u otra sobre el archivo en cuestión, comandos que podrán ser pasados igualmente a través de la línea de comandos o un archivo en cuya línea se identifique un comando a ejecutar por sed. Además sed permite el uso de expresiones regulares para realizar las búsquedas en el contenido de los archivos. La sintaxis de sed puede ser complicada e incluso representada de diferentes formas (en el apartado de comandos para el uso de expresiones regulares de este mismo capítulo hablaremos mas sobre sed). La sintaxis básica de ser es:

sed [-n] [-e comandos] [-f script-de-comandos] archivo_a_procesar.txt > archivo_para_guardar_cambios.txt

La opción -n evita que sed envíe su contenido modificado a la salida estándar a menos que la opción -p (print) haya sido igualmente declarada. Con -e podremos pasar comandos. Algunos comandos podrían ser: d (elimina), s (sustituye), q (imprime las líneas especificadas y sale) y p (imprime). Podemos pasar varios comandos separados por comas ‘,‘ y encerrados entre {comando,domando2..}. La opción .f indica a sed que los comandos serán pasados mediante un script de comandos. Los comandos aceptan direcciones, que son las líneas identificadas bien por su número o por patrones, y que servirán para tratar exactamente dichas líneas en vez del contenido completo de un archivo

$sed -n '4,6 !p' archivo.txt

En el ejemplo anterior no (negación !) se imprimirán (comando p) las líneas (dirección) de la 4 a la 6 Los comandos de sed además de aceptar direcciones y expresiones regulares aceptarán flags, que son etiquetas que modifican la funcionalidad del comando. Por ejemplo el comando s (sustituir) por defecto sustituye la primera ocurrencia del patrón, pero si se le añade la etiqueta g serán sustituidas todas aquellas ocurrencias de patrón.

$sed 's/\t/;/g' archivo.txt

El comando anterior sustituye todas (g) las tabulaciones (\t) del fichero archivo.txt por el carácter ; El comando sed se estudiará de forma mas completa (sintaxis, opciones, comandos, etiquetas, expresiones regulares y direcciones en el apartado de comandos para expresiones regulares de este mismo capítulo).

Consejos para posibles preguntas en este tema:

  • El método mas seguro para ejecutar un programa es estando en el directorio actual, escribir, ./nom_prog, en el caso de usar solo el nombre, es posible que hayan modificado la ruta del PATH malintencionadamente y hayan colocado una ruta que desconoces en la que se encuentra una copia de nom_prog maliciosa, será esta la que se ejecute al no especificar el directorio de trabajo (.)
  • Suelen ser preguntas tontas o básicas, te recomiendo que las leas detenidamente (como en cualquier examen tipo test) si no quieres tirarte de los pelos cuando te den la nota.
  • Para trabajar desde línea con un programa interactivo y querer guardar la salida en un archivo, no uses “>”, usa $nom_prog | tee archivo.txt ya que este comando divide la salida estándar.

 

Capítulo 1

Licencia Creative Commons Curso LPIC-1 400 Capítulo 1 por nebul4ck se distribuye bajo una Licencia Creative Commons Atribución-NoComercial-CompartirIgual 4.0 Internacional.


9 comentarios

  1. LUIS MIGUEL PORTILLO OMEARA dice:

    Ey man como te lo curras para que los demas aprendamos eh!!! Muy bien explicado!! A ver si me hago un experto en LINUX, conforme mas avanzo en este maravilloso sistema, menos hago uso de WIndows!!!

    Me gusta

  2. EMMANUEL dice:

    Mu buen material, me sirve muchissimo, muchas gracias por tu tiempo.

    Le gusta a 1 persona

  3. Gran trabajo, gracias

    Me gusta

  4. Omar dice:

    Hola!, gracias por este material, lo estaba buscando… de nuevo men, mil gracias

    Me gusta

Deja un comentario, Gracias!

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: