Introducción a Linux y la Terminal


Acerca de Linux

Linux es un sistema operativo parecido a Unix, el cual fue uno de los primeros sistemas operativos diseñados para las grandes computadoras que existían en 1969. Linux tiene muchas cosas en común con Unix, desde interfaces bastante arcaicas hasta su gran poder de ejecutar múltiples tareas conjuntamente, y aceptar a múltiples usuarios simultáneamente. La principal diferencia entre Linux y Unix es que el primero es totalmente libre y gratuito. Por lo que cualquier persona puede obtener Linux por internet e instalarlo en cualquier computadora que tenga.

Una gran ventaja de Linux es que es el sistema operativo más ampliamente usado para trabajo serio. Un dato interesante es que cerca del 97% de las 500 supercomputadoras más poderosas del mundo utilizan alguna variante de Linux como su sistema operativo (top500 lists). En lo que respecta el tema de este curso, la mayoría de las aplicaciones de bioinformática existen primero para Linux y solo a veces son re-codificados para Windows. Por último, aunque puede ser difícil de aprender, una vez que se sientan cómodos con Linux, podrán hacer uso de grandes computadoras, como el cluster del Langebio, o la supercomputadora del Cinvestav que forma parte de la Delta Metropolitana.

Para los que desean saber un poco más sobre Linux, pueden revisar la Wikipedia.


La Terminal

En Linux podemos hacer casi cualquier cosa desde una terminal, si sabemos cómo darle las instrucciones a la computadora. De hecho hay muchísimas cosas que solamente se pueden hacer desde la terminal. (Nota: el sistema operativo de Mac OSX se basa en una variante de Unix, y tiene una terminal con la que se puede trabajar prácticamente igual que si fuera un ambiente Linux)

El ícono para abrir la Terminal debe estar en la barra superior de sus escritorios. Están buscando algo que se ve así:

Denle click para que se vaya abriendo.

Lo primero que debemos aprender a hacer es cómo movernos en la terminal. Por ejemplo, cómo encuentro el lugar donde tengo unos archivos importantes con los que quiero trabajar? Para ello tenemos que entender cómo están organizados los archivos en Linux:

Para averiguar dónde estamos al iniciar la Terminal, podemos usar el comando pwd, que viene de print working directory:

pwd
/home/usuario

(A lo largo de estas prácticas, usaremos las convenciones de arriba para indicar instrucciones que le deben dar a la computadora y el resultado que la computadora les puede dar.)


Comandos básicos para moverse en la Terminal

Ahora iremos viendo una serie de comandos básicos que vale la pena conocer. En las siguientes tablas primero se resume lo que hacen una serie de comandos:

Comando Significado Ejemplos
ls muestra el contenido de un directorio (list) ls
ls Desktop
mkdir crea un directorio (make directory) mkdir bioinfo
cd cambia de directorio (change directory) cd bioinfo
cd
rmdir elimina un directorio (remove directory) rmdir bioinfo

Prueben esos ejemplos. Pueden ver lo que hacen?

Ejercicios:

Comandos básicos para manipular archivos

Para esta parte va a ser conveniente tener una serie de archivos con los cuales trabajar. Les he puesto archivos que contienen la secuencia del genoma y la anotación de la α-proteobacteria Rhizobium etli. Estos archivos fueron descargados originalmente de ftp://ftp.ncbi.nlm.nih.gov/genomes/Bacteria/Rhizobium_etli_CFN_42_uid58377/ pero para bajarlos con mayor velocidad los pueden encontrar aquí: R_etli.

Para empezar, bajen el archivo NC_004041.fna. Probablemente van a tener que darle click con el botón derecho para poder guardarlo a un archivo en el lugar que uds quieran.

Para probar los siguientes comandos, asegúrense de estar en la misma carpeta donde guardaron el archivo. Recuerdan cómo mostrar los archivos del directorio actual?

OJO: en la terminal de Linux se puede usar algo llamado tab-complete. Funciona despues de escribir las primeras letras de un comando o nombre de archivo, presionas la tecla TAB y el resto del nombre de comando o archivo debe completarse solo.

Comando Significado Ejemplos
cp copia un archivo cp NC_004041.fna NC_004041.fna.bk
mv mueve un archivo (o renombra) mv NC_004041.fna R_etli.fna
rm elimina un archivo (remove) rm NC_004041.fna.bk

Notas:

  • Cuando se copia o renombra un archivo, lo hará en la carpeta actual, a menos que es especifique una carpeta diferente en el segundo argumento.
  • Aunque el comando mv viene del verbo mover, el uso común es para renombrar archivos.
  • Algunos comandos, como rm, pueden preguntarles si están seguros. Generalmente hay que contestar y.

  • Ahora veamos algunos comandos para accesar el contenido de los archivos.

    Comando Significado Ejemplos
    cat muestra todo el contenido de uno o mas archivos (concatenate) cat R_etli.fna
    head muestra el principio de un archivo head R_etli.fna
    tail muestra el final de un archivo tail R_etli.fna
    more muestra el contenido de un archivo, pero progresivamente more R_etli.fna

    Notas:

  • Ciertos comandos, como more, abren una nueva interfaz en la que uno se puede mover arriba y abajo con las flechas. Para salirnos de esta interfaz en cualquier momento usamos la letra q.
  • Otros comandos, como cat, pueden generar tantos resultados que podemos querer cancelarlo antes de que termine. En este caso podemos usar la combinación Ctrl-C.


  • Ejercicios:

    Más comandos para manipular archivos

    Ahora veamos algunos comandos un poco más interesantes. Muchas veces queremos saber el número de renglones que tiene un archivo, o el número de palabras, o el de letras. En Linux esto es muy sencillo usando el comando wc:

    wc R_etli.fna
    
        5305    5314  376652 R_etli.fna
    

    Esto significa que el archivo tiene 5305 renglones, 5314 palabras o 376652 letras. Casi todos los comandos en Linux tienen argumentos que son como opciones para que el comando opere ligeramente diferente. Para el caso de wc tenemos algunas variantes para cuando solamente queremos obtener una de las cuentas:

    wc -l R_etli.fna
    
    wc -w R_etli.fna
    
    wc -c R_etli.fna
    

    Pueden ver lo que hacen estos argumentos?

    Otro comando muy útil es grep (viene de 'global regular expression print' pero no nos preocupemos por eso ahora). Este comando nos permite buscar cualquier texto dentro de un archivo. Veamos algunos ejemplos:

    grep "GGGGGGGGG" R_etli.fna
    
    CGACCGGCGACCGGCGGCTTCGGCGGGGGGGGGAGCGCCGTTGGGGTCGACCGCATCTACGGGCTCTATC
    GAGCGCTTTGAGCGCGGACTAAAGACCCGGCGCGAAGTCTTGGGGGGGGGCTATGTTGATGCGTCGGTCA
    

    El comando grep nos va a regresar todos los renglones del archivo que tengan el texto que buscamos.

    grep ">" R_etli.fna
    
    >gi|89255298|ref|NC_004041.2| Rhizobium etli CFN 42 symbiotic plasmid p42d, complete sequence
    

    El archivo que estamos manipulando contiene una secuencia en el llamado formato FASTA. Este formato permite que un archivo contenga una o muchas secuencias, pero cada una debe empezar por un renglón con la descripción de la secuencia, y este renglon siempre debe empezar con el caracter >. Por lo tanto, es muy usual tener que usar una instrucción como la anterior, para revisar cuántas y cuáles secuencias contiene un archivo FASTA.

    grep también tiene una serie de argumentos, para cuando queremos hacer algo un poquito más elaborado. Estas son algunas de las opciones más comunes:

    grep -i "gggggggg" R_etli.fna
    
    grep -c "GGGGGGGG" R_etli.fna
    

    El primero hace la búsqueda, pero ignorando mayúsculas y minúsculas. El segundo cuenta el número de renglones que contienen la palabra, en lugar de imprimir el contenido de los renglones.

    Ejercicios:
    Ejercicio integrativo:

    Combinación de comandos y cómo guardar los resultados

    Linux permite encadenar varios comandos. Es decir, ejecutar uno y que el resultado sea tomando por un segundo comando y a su vez el resultado de este puede ser tomado por un tercer comando. Para ello separamos los comandos por el símbolo |. Veamos un ejemplo:

    grep "transport" NC_004041.ptt | wc
    
          30     388    2843
    

    Lo que estamos haciendo, es ejecutar el comando grep primero (pruébenlo hasta antes del | si quieren). El resultado de ese comando, lo estamos enviando directamente al comando wc para contar los renglones, palabras y letras que tiene el resultado.

    Otra manera en que podemos manipular los resultados es redirigirlos a un archivo nuevo. Es decir, si queremos guardar el resultado de uno o varios comandos encadenados, podemos hacerlo de la siguiente manera:

    grep "transport" NC_004041.ptt > transport.txt
    

    El símbolo > va a redigir toda la salida del comando hacia un archivo llamado transport.txt

    Pueden ver el contenido de este nuevo archivo para confirmar que contenga lo que esperan.


    Últimos comandos de esta sesión

    Vamos a ver tres comandos más, que son útiles sobre todo sabiendo cómo encadenar comandos. El archivo .ptt que hemos estado usando tiene información en columnas:

    head NC_004041.ptt
    
    Rhizobium etli CFN 42 symbiotic plasmid p42d, complete sequence - 1..371254
    336 proteins
    Location Strand  Length  PID Gene Synonym  Code  COG     Product
    86..469     -  127   21492964 -  RHE_PD00001 -  -        hypothetical protein
    616..1575   -  319   21492963 -  RHE_PD00002 -  -        insertion sequence transposase
    2393..3361  +  322   21492961 -  RHE_PD00004 -  COG2801L insertion sequence transposase
    4408..5373  -  321   21492960 -  RHE_PD00005 -  COG1961L DNA resolvase
    6041..7045  +  334   89255299 -  RHE_PD00006 -  COG0464O ATPase
    7045..9516  +  823   21492958 -  RHE_PD00007 -  -        hypothetical protein
    9539..10087 -  182   21492957 -  RHE_PD00008 -  -        hypothetical protein
    

    Si queremos obtener solamente una o algunas de estas columnas, podemos usar el comando cut. Veamos unos ejemplos:

    cut -f 1 NC_004041.ptt | head
    
    Rhizobium etli CFN 42 symbiotic plasmid p42d, complete sequence - 1..371254
    336 proteins
    Location
    86..469
    616..1575
    2393..3361
    4408..5373
    6041..7045
    7045..9516
    9539..10087
    

    Lo que hicimos fue obtener la columna 1 (-f se refiere a field que es el campo o columna), y en lugar de ver la columna completa en pantalla, la pasamos al comando head para mostrar solo la primera parte.

    Nota:

  • Podemos extraer múltiples columnas haciendo cut -f 1,4,8 archivo

  • Hay un comando en Linux para reordenar el contenido de un archivo o la salida de otro comando. Se llama sort y lo podemos usar así:

    cut -f 8 NC_004041.ptt | sort
    

    En la salida de esa instrucción hay mucha redundancia. Esto da pie a un comando llamado uniq que sirve para eliminar renglones repetidos, preservando solamente una copia única.

    cut -f 8 NC_004041.ptt | sort | uniq | head
    
    -
    336 proteins
    COG
    COG0079E
    COG0108H
    COG0142H
    COG0143J
    COG0265O
    COG0288P
    COG0300R
    
    Ejercicio final:

    Resumen de los comandos de esta práctica

    Comando Significado Ejemplos
    pwd muestra el nombre de la carpeta actual (print working directory) pwd
    ls muestra el contenido de un directorio (list) ls
    ls Desktop
    mkdir crea un directorio (make directory) mkdir bioinfo
    cd cambia de directorio (change directory) cd bioinfo
    cd
    rmdir elimina un directorio (remove directory) rmdir bioinfo
    cp copia un archivo cp NC_004041.fna NC_004041.fna.bk
    mv mueve un archivo (o renombra) mv NC_004041.fna R_etli.fna
    rm elimina un archivo (remove) rm NC_004041.fna.bk
    cat muestra todo el contenido de uno o mas archivos (concatenate) cat R_etli.fna
    head muestra el principio de un archivo head R_etli.fna
    tail muestra el final de un archivo tail R_etli.fna
    more muestra el contenido de un archivo, pero progresivamente more R_etli.fna
    wc cuenta palabras de un archivo (word count) wc R_etli.fna
    wc -l R_etli.fna
    grep encuentra renglones que contengan lo que buscas (global regular expression print) grep ">" R_etli.fna
    grep -c "GGGGGGGG" R_etli.fna
    | encadena comandos, enviando la salida de un comando a la entrada del siguiente grep "transport" NC_004041.ptt | wc
    > envía la salida de un comando a un archivo grep "transport" NC_004041.ptt > transport.txt
    cut extrae (corta) ciertas columnas de un archivo cut -f 1,4 NC_004041.ptt | head
    sort ordena el contenido de un archivo o la salida de un programa cut -f 8 NC_004041.ptt | sort
    cut -f 3 NC_004041.ptt | sort -n
    uniq regresa solamente las líneas únicas (elimina repetidos) cut -f 8 NC_004041.ptt | sort | uniq