LPIC

Guía extraoficial de estudio

Comandos para resumir ficheros (cut y wc)

En esta entrada vamos a ver los los últimos comandos de filtrado de texto que nos faltan. Veamos los comandos cut y wc.

Cut

Es utilizado para la extracción de segmentos (campos, caracteres o bytes) de un fichero de entrada para mostrarlos por la salida estándar. Sus opciones son:

Flag Resultado
-b o –bytes Corta por el número de bytes especificados
-c o –characters Corta por el número de caracteres especificados
-f o –fields Corta por el número de campos especificados. Por defecto los campos están delimitados por una tabulación, aunque podemos cambiar el carácter delimitador con “-d carácter_delimitador”).

Con ejemplos lo entenderemos mejor. Vamos a ver el formato del fichero passwd:

[super@localhost ~]$ cat /etc/passwdsuper:x:1000:1000:super:/home/super:/bin/bash
usuario1:x:1002:1000:usuario1:/home/usuario1:/bin/bash
usuario2:x:1003:1000:usuario2:/home/usuario2:/bin/bash
usuario3:x:1004:1000:usuario3:/home/usuario3:/bin/bash
usuario4:x:1005:1000:usuario4:/home/usuario4:/bin/bash

En este caso, los campos están delimitados por “:”, y no por tabulaciones. Tendremos que usar el flag -d para cambiar el campo delimitador. Si quisiéramos obtener un listado de los usuarios del sistema y su directorio home (campos 1 y 6), deberíamos ejecutar la siguiente orden:

[super@localhost ~]$ cat passwd | cut -f1,6 -d”:”
super:/home/super
usuario1:/home/usuario1
usuario2:/home/usuario2
usuario3:/home/usuario3
usuario4:/home/usuario4

Observamos que hemos utilizado -f1,6 para que nos corte los campos 1 y 6. Si quisiéramos que nos cortara todos los campos que van del 1 al 6, la sintaxis sería -f1-6, y si en vez de campos, queremos cortar por caracteres, seria -c1-6, para cortar los caracteres del 1 al 6.

Wc (Word Count)

Comando que genera un contador de palabras, lineas o bytes. Su uso es muy sencillo y útil.

[super@localhost ~]$ wc /etc/passwd
36   56 1788 /etc/passwd

El resultado nos indica que el fichero contiene 36 lineas, 56 palabras y 1788 bytes. Si queremos especificar un único formato de salida, se haría con

Flag Resultado
-l o –lines Cuenta las lineas
-w o –words Cuenta las palabras
-c o –bytes Cuenta los bytes
-m o –chars Cuenta los caracteres

Comandos para visualizar ficheros (head, tail y less)

Vamos a comentar algunos de los comandos más utilizados para la visualización de ficheros:

Visualizar el inicio de los ficheros con head.

head  fichero.txt nos mostrará las 10 primeras lineas de éste. Esto es útil si necesitemos ver la cabecera de un archivo, por ejemplo. Podemos especificar el número de lineas con el flag -n, o el número de bytes con -c.

Visualizar el final del fichero con tail.

Este comando actúa de la misma manera que head, solo que al revés. Al ejecutar tail fichero.txt el shell nos mostrará las 10 últimas lineas. Este comando es utilizado para examinar la actividad reciente en los ficheros de registro (logs), o en otros fichero a los que haya que añadir datos. También estás disponibles los flags -n y-c.

Recorrer las páginas del fichero con less.

Éste comando no es más que una versión mejorada de more. Posee algunas funcionalidades, como la de poder retroceder por páginas en un fichero, que le hacen más interesante. No obstante, aunque suele venir configurado por defecto en Linux, muchos siguen utilizando more. Cuando ejecutamos este comando sobre un fichero, es posible avanzar o retroceder páginas. Veamos su funcionamiento:

Tecla Resultado
Barra espaciadora Avanza por el fichero
Esc + v Retrocede por el fichero
Flecha arriba y abajo recorre el fichero linea a linea
/palabra_a_buscar Busca la palabra en el documento, hacia adelante.
?palabra_a_buscar Busca la palabra en el documento, hacia atrás.
g+num Nos lleva a la línea especificada, en este caso la 50
q Salir del programa

Comandos para transformar ficheros: expand, sort, split, uniq y tr

Los comandos que vamos a comentar no cambian realmente el contenido de los ficheros, sino que envían el fichero modificado a la salida estándar. Después, podemos canalizar la salida a otro comando o fichero.

expand : convertir tabulaciones en espacios:

Interesante comando para los que programan pequeños scripts o programas desde un editor de texto. Todavía recuerdo la primera vez que lo utilicé. Estuve varios días programando un programa en python, era para una práctica que tenia que presentar. Después de que el profesor modificara las lineas de código que creyera oportunas, el programa devolvía errores de indexación todos lados. Motivo? pues el editor de texto que yo utilicé tenia definidos las tabulaciones como tabulaciones (lógico), y mi profesor tenia la opción marcada de gedit de “insertar espacios en lugar de tabulaciones” y ancho de tabulador 4. Cada vez que pulsaba el tabulador, insertaba cuatro espacios. Fue tan sencillo como hacer:

[super@super Documentos]$ expand -t 4 prog.py > prog_con_espacios.py
El comando unexpand, hace lo opuesto, convierte varios espacios en tabulaciones. También acepta la opción -t num.

sort: ordenar ficheros

Sort (en inglés ordenar), es utilizado para ordenar la salida de un comando. Tenemos el documento abecedario.txt que contiene letras al azar. Para mostrar una salida ordenada:

[super@super Documentos]$ sort abecedario.txt
c
d
d
e
f
g
h
q
r
s
t
x
x
z
Recordemos que sort ordena por el valor ASCII, el cual distingue entre letras mayúsculas y minúsculas.

Algunas de las opciones de este comando son:

Flag Resultado
-f o –ignore-case Ignora entre mayúsculas y minúsculas
-M o –month-sort Ordena por las abreviaturas de tres letras de los meses (de JAN a DEC)
-r o –reverse Invierte el orden
-n o –numeric-sort Ordenación numérica
-k campo o –fey=campo Permite definir el campo de la ordenación

split: dividir ficheros

Este comando nos permite dividir un fichero en dos o más.

Algunas de las opciones de este comando son:

Flag Resultado
-b tamaño o –bytes=tamaño Divide el fichero por bytes. Puede corta un fichero por la mitad de una linea.
-C tamaño o –line-bytes=tamaño Divide un fichero por el numero de bytes especificado sin romper sus lineas.
-l lineas o –lines=lineas Divide un fichero en bloques no superiores al número de lineas especificado.

El siguiente comando nos genera los ficheros aba, abe, abc, etc, con tres lineas cada uno, extraidas del fichero abecedario.txt:

split -l 3 abecedario.txt ab

uniq: eliminación de lineas duplicadas

Nos permite eliminar todas las lineas que sean idénticas.

Supongamos que al ordenar un fichero, queda de la siguiente manera:

[super@super Documentos]$ sort fichero.txt
aa
aa
bb
bb
cc
cc

Para eliminar duplicados ejecutamos:

[super@super Documentos]$ sort fichero.txt | uniq
aa
bb
cc

tr : traducción de carácteres

Su sintaxis puede resultar un poco confusa para algunos:

tr [OPCIÓN] … SET1 [SET2]

Veamos algunos ejemplos para entenderla mejor. Queremos convertir todas las vocales de la siguiente frase a mayúsculas:

[super@super Documentos]$ echo frase de ejemplo | tr aeiou AEIOU
frAsE dE EjEmplO

También podemos utilizar dicho comando para eliminar ciertos caracteres, con -d:

$ echo hola | tr -d o
hla

Ahora eliminiaremos todos los espacios repetidos que tengamos en una frase con la opción -s:

[super@super Documentos]$ echo ‘esto es       una frase    con    espacios  repetidos’ | tr -s ‘ ‘
 esto es una frase con espacios repetidos

Comandos para combinar ficheros: cat, join y paste

Combinar ficheros con cat

Aunque este comando es utilizado para mostrar el contenido de ficheros pequeños, lo cierto es que és una herramienta para combinar ficheros (cat es abreviatura de concatenar). Utilizando este comando con una redirección de salida, se puede combinar dos ficheros en uno:

cat fichero_1.txt fichero2.txt > fichero_combinado.txt

Algunas de las opciones que ofrece son:

Flag Resultado
-E o –show-ends Muestra el signo dolar al final de cada linia ($)
-n o –number Numera las lineas al comienzo de cada una
-b o –number-nonblank Solo numera las lineas que contienen texto
-s o –squeeze-blank Substituye los grupos de lineas en blanco por una sola
-T o –show-tabs Muestra los carácteres de tabulación como ^I
El comando tac (cat al revés), invierte el orden de las lineas al mostrarlas

Asociar de ficheros por campos con join

Este comando combina dos ficheros según el campo que hayamos especificado. Por defecto join tiene en cuenta el primer campo para realizar la combinación.

Si fichero1.txt contiene:

08020 sant marti
03030 sant andreu

y el fichero2.txt:

telefono 999933993
telefono 223232323

Vemos que sucede al ejecutar el comando join:

[super@super Documents]$ join fichero1.txt fichero2.txt
08020 sant marti telefono 999933993
03030 sant andreu telefono 223232323

En el siguiente caso, mezclamos tomando como referencia los campos número dos de ambos ficheros:

join -1 2 -2 2 fichero1.txt fichero2.txt

-1 y -2 hacen referencia al fichero según el orden por el que es introducido en el comando. En este caso “-1” es fichero1.txt porque lo escribimos antes, y “-2” fichero2.txt.  El dígito que ponemos después de este sirve para indicar por que campo de este fichero queremos asociar, en este caso hemos escogido el campo dos de los dos ficheros.

Es importante que los ficheros estén ordenados por el campo que se van a mezclar.

Fusionar líneas con paste

La función de este fichero es la de fusionar ficheros línea a línea, separando las líneas de cada fichero mediante tabulaciones.

Teniendo en cuenta que el contenido de fichero1.txt y fichero2.txt es el mismo que en el ejemplo anterior, el resultado de este comando:

[super@super Documents]$ paste fichero1.txt fichero2.txt

sería:

08020 sant marti    telefono 999933993
03030 sant andreu    telefono 223232323
Para que el resultado tenga sentido, los ficheros deben tener el mismo número líneas.

Bifurcaciones y paso de múltiples argumentos a comandos

Bifurcaciones

tee: este comando se encarga de dividir la entrada estándar para que se muestre en la salida estándar y en tantos ficheros como se desee. Esto es útil cuando no solo se quieren enviar datos hacia una tuberia, sino también guardar una cópia en un archivo. Si este no existe, lo crea, y si existe lo sobrescribirá, siempre y cuando no usemos el flag -a.

Supongamos que queremos ver el contenido de un archivo por pantalla y a su vez guardar el contenido en un fichero:

cat fichero.txt | tee contenido.txt

Generar líneas de comandos

xargs: este comando se utiliza para pasar un gran número de argumentos a otros comandos. En la siguiente instrucción queremos borrar todos los ficheros que terminen en .py de nuestro directorio home:

find ~/ -name *.py | xargs rm

Si a su vez quisiéramos guardar un archivo .log con todos los ficheros que hemos eliminado:

find ~/ -name “*.l” | tee ficheros_borrados.log | xargs rm

Pipes

Empecemos traduciendo la palabra al español:  pipe –> tubería.  Tener claro esto va a ser fundamental para entender su funcionamiento.

Las pipes o pipelines se representan mediante la barra vertical ( | ). Se utilizan para redireccionar la salida estándar de un programa a la entrada estándar de otro. La mejor forma para comprenderlas es viendo un ejemplo.

Supongamos que necesitamos extraer un determinado dato de un fichero. El fichero passwd, situado en /etc, contiene datos sobre los usuarios y grupos definidos del sistema. Ejecutamos cat /etc/passwd para ver su estructura:

at:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/bash
avahi:x:105:107:User for Avahi:/var/run/avahi-daemon:/bin/false
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:Daemon:/sbin:/bin/bash
dnsmasq:x:104:65534:dnsmasq:/var/lib/empty:/bin/false
ftp:x:40:49:FTP account:/srv/ftp:/bin/bash
games:x:12:100:Games account:/var/games:/bin/bash
lp:x:4:7:Printing daemon:/var/spool/lpd:/bin/bash
mail:x:8:12:Mailer daemon:/var/spool/clientmqueue:/bin/false
man:x:13:62:Manual pages viewer:/var/cache/man:/bin/bash
messagebus:x:101:103:User for D-Bus:/var/run/dbus:/bin/false
mysql:x:60:106:MySQL database admin:/var/lib/mysql:/bin/false
news:x:9:13:News system:/etc/news:/bin/bash
nobody:x:65534:65533:nobody:/var/lib/nobody:/bin/bash
ntp:x:74:102:NTP daemon:/var/lib/ntp:/bin/false
postfix:x:51:51:Postfix Daemon:/var/spool/postfix:/bin/false
pulse:x:106:108:PulseAudio daemon:/var/lib/pulseaudio:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
rtkit:x:103:105:RealtimeKit:/proc:/bin/false
sshd:x:100:101:SSH daemon:/var/lib/sshd:/bin/false
statd:x:102:65534:NFS statd daemon:/var/lib/nfs:/sbin/nologin
uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
wwwrun:x:30:8:WWW daemon apache:/var/lib/wwwrun:/bin/false
super:x:1000:100:super:/home/super:/bin/bash
usbmux:x:107:65534:usbmuxd daemon:/var/lib/usbmuxd:/sbin/nologin

Queremos saber si el usuario “super” existe en el sistema, y si es así, que Uid  tiene. Dado que la magnitud de este fichero puede ser muy grande, descartamos la búsqueda “a ojo” y haríamos lo siguiente:

cat /etc/passwd | grep ^super | cut -f3 -d”:”

Hemos usado dos pipes, por lo tanto podemos diferenciar tres bloques:

  • cat /etc/passwd: muestra el contenido del fichero.
  • grep ^super: de las lineas mostradas por el comando anterior, busca la que empiece por “super”.
  • cut -f3 -d”:” : corta el campo 3 de la linea, teniendo en cuenta que delimitamos los campos con “:”

Más adelante veremos mejor el funcionamiento del comando grep y cut, lo que nos debe quedar claro ahora es como hemos entrelazado tres comandos distintos para obtener un resultado, que en este caso será “1000”.

Las pipes pueden tener una longitud arbitraria:

comando uno |comando dos | comando tres […..]

Otro ejemplo interesante podría ser.

grep /bin/bash /etc/passwd | wc -l

En este caso, nos devuelve el número de usuarios que tengan definida la shell bash.

Flujos estándares y su redirección

De entre los diferentes tipos de flujo, definiremos los tres que destacan:

  • Entrada estándar (stdin): Es la utilizada para recoger información. En la mayoría de los casos es a través del teclado.
  • Salida estándar (stdout): Se usa para enviar información al exterior. Suele ser el monitor.
  • Error estándar (stderr) : Es utilizada para llevar los mensajes  de error y de alta prioridad.

Ahora veamos una tabla con los operadores comunes de redirección:

Operador Efecto
> Crea un fichero que contiene la salida estándar. Si el fichero existe, se sobrescribe.
>> Añade al fichero la salida estándar. Si el fichero no existe, se sobrescribe.
2> Crea un fichero con la salida de error estándar. Si el fichero no  existe, se crea.
2>> Añade a un fichero la salida de error estándar. Si el fichero no existe, se crea.
&> Crea un fichero que contiene tanto el error estándar como la salida estándar. Si el fichero existe, se reemplaza.
<> El fichero especificado se  utiliza tanto para la salida estándar como para la entrada estándar.
< El contenido del fichero especificado se envía para utilizarlo como entrada estándar
<< Acepta el texto de las siguientes lineas como entrada estándar.

Veamos ejemplos:

  • Operador “>”:
super@linux-jweh:~> echo envio frase a fichero  >  fichero.txt
super@linux-jweh:~> cat fichero.txt
envio frase a fichero
  • Operador “>>”:

En este ejemplo, vemos como el resultado de ejecutar la orden “ls Descargas” se añade a fichero.txt:

super@linux-jweh:~> ls Descargas >> fichero.txt
super@linux-jweh:~> cat fichero.txt
envio frase a fichero
299859_10150486380139606_800839605_11184435_1607766419_n.jpg
bbgf126.wmv
gbbm12.jpg
gbbm25.jpg
gbbm26.jpg
install-apt4suse.rpm
libapt-pkg-libc6_9-6-2-0.5.15lorg3.2-123.12.i586.rpm
Public
Public.zip
  • Operador “2>”:

Ahora vamos a intentar listar una carpeta que no existe, y enviar los errores a un fichero:

super@linux-jweh:~> ls carpeta_no_existe >> fichero.txt 2>errores.txt
super@linux-jweh:~> cat errores.txt
ls: no se puede acceder a carpeta_no_existe: No existe el fichero o el directorio

Como vemos, no muestra ningún error por pantalla diciendo que la carpeta no existe, ya que hemos redirigido la salida de error al fichero “errores.txt”

  • Operador “2>>”:

Este comando haría exactamente lo mismo que el anterior, solo que las lineas de error se añadirían a las ya existentes.

  • Operador “&>”:

Podríamos decir que este operador actúa como “>” y “2>” a la vez. Vamos a listar una carpeta que existe y otra que no, redirigiendo su salida a fichero.txt.

super@linux-jweh:~> ls carpeta_no_existe Descargas/ &> fichero.txt
super@linux-jweh:~> cat fichero.txt
ls: no se puede acceder a carpeta_no_existe: No existe el fichero o el directorio
Descargas/:
299859_10150486380139606_800839605_11184435_1607766419_n.jpg
bbgf126.wmv
gbbm12.jpg
gbbm25.jpg
gbbm26.jpg
install-apt4suse.rpm
libapt-pkg-libc6_9-6-2-0.5.15lorg3.2-123.12.i586.rpm
Public
Public.zip

Vemos que tanto los errores como el resultado de “ls Descargas” se guardan en el mismo fichero.

  • Operador “<>”:

Utilizamos fichero.txt para tanto para la salida estándar como para la entrada estándar.

super@linux-jweh:~> <> fichero.txt
  • Operador “<“:

En el siguiente ejemplo vemos como cambiamos a al vez la entrada y salida estándar de un programa. Cogemos el contenido de “fichero.txt” y lo enviamos a “fichero2.txt”.

super@linux-jweh:~> cat < fichero.txt > fichero2.txt

Podríamos haber omitido el uso de “<” y en este caso el resultado hubiera sido el mismo. Unix dispone de un gran número de comandos que leen de la entrada estándar, realizan la operación con el texto y escriben en la salida estándar: cat, grep, soft, cut, sed, tr…

  • Operador “<<“:

Hacemos que “programa” acepte la entrada hasta que vea una linea que contiene solo EOF:

 super@linux-jweh:~> programa << EOF
> hola
> EOF

Combinaciones de teclas en la consola de comandos

Vamos a describir algunas de las combinaciones de teclas más útiles que tiene la consola de comandos, que nos van a ayudar a mejorar nuestra productividad y velocidad:

Combinación Resultado         
Ctrl+A/E Desplazar el cursor al principio o final de la linea
Ctrl+flecha izq/der Desplazar el cursor palabra a palabra
Ctrl+l Borra la pantalla (clear)
Ctrl+d Final de archivo EOF – cancela – borra carácter que hay debajo del cursor
Ctrl+c Mata un proceso
Ctrl+z Suspende un proceso
Ctrl+k Borra el texto que hay entre el cursor y el final de la línea
Ctrl+x+retroceso Borra el texto que hay entre el cursor y el principio de la línea
Shift+insert Pega el texto copiado
Ctrl+insert Copia el texto seleccionado
Ctrl+r Comienza una búsqueda hacia atrás de un comando por las letras que introduzcas.
Ctrl+s Comienza una búsqueda hacia adelante de un comando (útil solo si nos hemos pasado pulsando “flecha adelante” para buscar un comando) por las letras que introduzcas.

Para practicar con las  últimas combinaciones de teclas, recordad el comando history (muestra historial de comandos) y history -c (lo borra).

Comandos internos y externos

La diferencia entre estos dos tipos de comando no es más que los internos son los nativos de la consola. Digamos que los externos el intérprete no los sabe ejecutar y para ello requiere su localización en el disco duro. Para encontrarlos, los buscará en una serie de directorios, en concreto aquellos que están indicados en la variable PATH.

Veamos que contiene la variable PATH de mi sistema:

super@linux-jweh:~> echo $PATH
/home/super/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib/jvm/jre/bin

Cada directorio separado por ” : ” es un “lugar” donde bash va a buscar dichos comandos externos.

Algunos de los comandos internos de bash son:

  • cd: Comando utilizado para el cambio de directorio de trabajo.
              super@linux-jweh:~> cd /home/super/
              super@linux-jweh:~> pwd
              /home/super
  • pwd: como hemos visto en el ejemplo anterior, este comando muestra por pantalla el directorio de trabajo actual.
              super@linux-jweh:~> pwd
              /home/super
  • echo: Muestra el texto que le sigue. Se podría decir que es como un “printf” en C. En el caso pasarle una variable, muestra su contenido.
                  super@linux-jweh:~> echo hello
  • exec: este comando se utiliza para la ejecución de un programa especificado. Tiene la funcionalidad adicional de ejecutarse junta a la consola, no crea un nuevo proceso. Con esto, cuando finalice la ejecución del programa, finalizará también la consola.
  • time: Muestra el tiempo que tardan en ejecutarse los siguientes procesos:
 [J.F.]$ time ls
1 2 3 back.tar.gz backup.tar
real 0m0.01s
user 0m0.00s
sys 0m0.01s
  • exit: cierra la consola.
Podemos ver más comandos internos ejecutando el comando “help” (también interno) en nuestra consola.

De entre los comandos externos, podríamos citar algunos:

  • ls: sin argumentos,  muestra el contenido del directorio actual. Si le indicamos un directorio, muestra el contenido de dicho directorio.
   super@linux-jweh:~> ls
   bin   Descargas   EOF         Imágenes  Música      Plantillas   Público
   come  Documentos  Escritorio  menu.py   output.txt  public_html  trabajo
   super@linux-jweh:~> ls trabajo/
   copiafitxers.py  formateado   olag    olasaa  olasac  olasa_may   test
   fichero.txt      formateado2  ola.py  olasab  olasad  salida.txt  tabu.txt
  • cp: copia un fichero o directorio.
         super@linux-jweh:~/trabajo> cp formateado formateado_copia
  • mv: mueve un fichero a otro lugar. Si l directorio de destino es el mismo que el de origen, en fichero se renombrará.
        super@linux-jweh:~/trabajo> mv formateado formateado8
  • rm: borra un fichero
        super@linux-jweh:~/trabajo> rm fichero_para_borrar.txt

Presentación LPIC-1

;

Para todas esas personas que deseen obtener la “Linux Professional Institute Certification” y no encuentren material en castellano, o simplemente necesiten una ayudita, voy a crear este blog-guia para intentar ayudarles lo máximo posible. Primero aclarar que se trata de una guía de estudio y no debe ser la única referencia que tengamos. El objetivo es marcar que puntos deberán estudiarse con más fuerza e intentar aclarar vuestras dudas . Para hacerla me voy a basar en el libro “Guía de estudio – exámenes 101 y 102″ de Roderick W. Smith, del todopoderoso Sr. google y demás enlaces que ya iré poniendo durante el desarrollo de la misma.

Actualmente existen tres niveles de certificación:

  • LPIC-1 o Profesional junior en Linux
  • LPIC-2 o Profesional avanzado en Linux
  • LPIC-3 o Profesional senior y expecialista en Linux.

De momento nosotros nos centraremos en la primera.

Aprovecho la presentación para aclarar los pasos que deben seguirse para presentarse a los exámenes 101 y 102 (LPIC-1).

  1. Debemos registrarnos en el LPI para obtener un número ID. ( En la barra de superior del menú tenemos enlaces de interés)
  2. Nos enviarán por correo electrónico el ID, con el que podremos registrarnos en algunas de las dos firmas que lo administran: Thomson Prometric y Pearson VUE .
  3. Deberemos facilitar el nombre, dirección de correo, teléfono, cuando y donde se desea realizar la prueba y el número de la tarjeta de crédito.

Espero que os sirva de ayuda.