- Disponer de un ordenador con sistema operativo sobre el que tengamos permisos de superusuario/administración.
- Preferiblemente, GNU/Linux. Si no lo tienes, igual es un buen momento para instalártelo.
- Manejo del entorno de escritorio.
- Instalación y desinstalación de programas.
- Resolución de problemas.
- Conocimiento del árbol de directorios. Rutas y enlaces simbólicos
- Manejo de versiones de archivos.
- Conocimiento de la arquitectura hardware del ordenador.
- Conocimiento de la estructura del sistema operativo.
- Uso de la terminal, consola Unix.
- Manejar la estructura de ficheros.
- Distinguir entre rutas absolutas y relativas.
- Nociones de las distintas codificaciones de caracteres.
- Qué tipos de datos hay
- Qué tipos de formatos de datos hay.
- Usuarios y grupos, permisos
- Espíritu crítico.
- Ganas de aprender.
- Atajos de teclado.
- Conocer la Web: navegador, lenguaje HTML, programas, utilidades, atajos, buscadores.
- Git, git*,
- Nociones de periodismo de datos: investigación, datos y visualización.
¿De qué hablamos cuando nos referimos lxs periodistas a que no sabemos programar?
- Todos los lenguajes que utiliza un ordenador.
- Lenguajes de programación: Python, R, Haskell, Lisp
- Lenguajes de especificación, descripción o marcado: HTML, CSS, MD
- Lenguajes de consulta: SQL, XQuery, SPARQL
- Lenguajes de transformación: XSLT
- Lenguajes de sonido
- Lenguajes gráficos
- Pseudocódigo
- Lenguaje formal diseñado para realizar procesos que pueden ser llevados a cabo por máquinas como las computadoras.
- Controlar el comportamiento físico y lógico de una máquina.
- Formado por un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones.
Sujeto Predicado Objeto
Función Variable Argumento
Para ejecutar el comando sin más, por ejemplo, ls
, escríbelo y pulsa
Enter
o retorno de carro
ls
En el caso de ls
, podemos decirle que nos liste un archivo concreto,
por ejemplo:
ls alumnxs.org
Otros comandos pueden requerir uno o más argumentos.
- Cada comando tiene múltiples opciones, y se pueden combinar.
- Las opciones se suelen escribir con una sigla que corresponde con una palabra, separado por un guión.
- Por ejemplo, si escribimos
ls -r
, listamos el directorio en orden inverso.
ls -r
Nótese la diferencia con la ejecución anterior.
- Números enteros o integers
- Decimales, flotantes o floats
- Cadenas -de caracteres- o strings
- Booleanos: verdades o falso
- Otros objetos
\n
, línea nueva\b
, backspace\r
, retorno de carro.\t
, tabulador\f
, formfeed\e
, espacio\\
, barra invertida\"
, comillas\000
, carácter octal.
- Navegador: Firefox y Chrome, porque cumplen con estándares web.
- Compresor: 7-zip. Por favor, dejad de usar Winraaaaaaar.
- Consola: Cygwin, con los paquetes R, Python, Emacs, convert, git, etc.
- Editor: Emacs, Notepad++, Sublime, Atom… puedes leer cómo elegir un buen editor de textos.
- Se puede descargar y utilizar tanto en Linux, Windows o
Mac. Podemos descargarlo desde:
- ftp de Emacs
- elegir un mirror
- dejar que nos sugieran el mirror más cercano a nuestra ubicación.
Hemos de hacer 3 pasos:
- Instalar los paquetes con los que queremos trabajar.
- Configurar para que no sea
vi
el editor por defecto. - Cambiar la variable
db_home
- La consola viene con un conjunto de paquetes básicos.
- Para usar más paquetes, en el momento de la instalación del
setup
, tenemos que elegir los paquetes. - Ojo, cuando queramos instalar otro paquete, tendremos que hacer lo
mismo, volver a correr
setup
- Algunos paquetes para trabajar con datos:
- git, para trabajar con git, software de control de versiones.
- imagemagick, para manipular imágenes.
- emacs, para editor de texto.
- python, para trabajar con Python.
- R, para trabajar con R.
- perl, para trabajar con perl.
- ruby, para trabajar con ruby.
- tesseract, herramienta de reconocimiento óptico de caracteres (OCR), con los paquetes en inglés y español dado que son los idiomas más habituales.
- grep, para realizar búsquedas en el texto.
- pdfgrep: para realizar búsquedas en texto de pdfs.
- sgrep, para realizar búsquedas de texto en documentos SGML, XML o HTML.
- gawk, para procesar texto.
- sed, para editar flujos de texto.
- qpdf, para transformación de PDF
- xpdf, para visionar y otras operaciones con pdf
- odt2txt, para pasar un odt a txt.
- xlsx2csv, para pasar un xlsx a csv.
- p7zip, archivar y comprimir datos.
- gzip, compresor de datos
- unzip, descompresor de datos
- zip, compresor de datos
- lynx, visor web
- links, visor web
- curl, transferencia de archivos multiprotocolo
- wget, descargar archivos de la web
- less, paginador, similar a more
- vim, editor de textos
- Cuando editamos un archivo de configuración, por ejemplo de
git
, el programa que utiliza por defecto esvi
, complicado pero no imposible (manual en inglés y español). - Si os mola el rollo
vi
, sería mejor instalarvim
(manual). - Propongo modificarlo por
emacs
, que además comparte atajos con la terminal. (reference card y cheat sheet… con orgmode, un plus!)
Para ello, editaremos desde nuestro editor favorito, el archivo
.bashrc
del directorio de Cygwin y pondremos:
export VISUAL=emacs export EDITOR="$VISUAL"
- Por defecto, la home del usuarix de Cygwin es el directorio de instalación del programa.
- Para disfrutar de Cygwin y acceder a todo el disco, debemos
modificar la variable
db_home
en/etc/nsswitch.conf
Escribimos:
db_home: windows
O de forma equivalente:
db_home: /%H
De esta última manera puedes interpretar el esquema y hacer que estén
dentro del subdirectorio cygwin
, por ejemplo:
db_home: /%H/cygwin
En esta página proponen otro método:
mkpasswd -l -p "$(cygpath -H)" > /etc/passwd
- Es una sintaxis simple heredera de las sintaxis del correo electrónico en modo texto y otras.
- Lo inventó John Gruber para escribir y leer fácil
HTML
. - Además de una sintaxis, es un
parser
o conversor. - Algunos enlaces: mis apuntes de Markdown, Markdown Cheatsheet y R Markdown Cheatsheet: R, Markdown y YAML
- La línea de comandos es una interfaz de usuarix basada en líneas de
comandos (Command Line Interface o CLI).
- Cuando utilizamos un ordenador, tenemos interfaces para utilizar los
programas.
En la actualidad, cuando utilizamos un ordenador personal –de forma general–, usamos interfaces gráficas de usuarix GUI (Graphic User Interface).
Pero también podemos, de forma general o específica, utilizar otras interfaces como son:
- Las referidas CLI
- Las NUI (Natural User Interface o
interfaz natural de usuarix), como pueden ser las pantallas capacitivas multitáctiles, Kinect –con el movimiento– o Siri –con el reconocimiento de lenguaje natural– .
Al inicio de los ordenadores, solo había líneas de comandos para comunicarnos con ellos. Bell Telephone lanzó en 1969 V1 sobre UNIX Timeshare System. UNIX tenía la shell sh que era la única forma de comunicarse con el ordenador.
Así fue hasta 1973, cuando Las GUI fueron desarrollados en el Centro de Investigación de Xerox en Palo Alto (Palo Alto Research Center, PARC).
Tiempo después, Apple pagó para estudiar la idea, que finalmente se concreto en su GUI.
El MIT desarrolla una GUI para Unix en 1986, X.
El sistema XFree86 de Linux se desarrolló en 1996, una implementación libre del original X, al que homenajea en el nombre.
- Ahorras tiempo
- Te ofrecen una alternativa a las GUI.
- Te acercan más a cómo funcionan los sistemas POSIX.
- Funcionas con atajos compartidos.
- Te preparan para la programación.
- Aprendes otra forma de hacer las cosas.
- Te empodera.
- Utilizaremos un emulador de terminal, dado que estamos en un entorno gráfico.
- La terminal es la interfaz más directa con el sistema operativo.
- Una shell es un intérprete de comandos de la terminal.
- Un comando u orden es una utilidad que ejecutas en la shell.
- La salida es lo que devueve el comando, normalmente en la terminal, llamada STDOUT por STandarD OUTput o salida estándar.
- La entrada de datos, argumentos o comandos es lo que se conoce como STDIN por STandarD INput.
- Un proceso es una aplicación que corre (está ejecutada, funciona) en tu ordenador. Puede estar activa o durmiendo.
C-l
, limpia la consola, es lo mismo que darle aclear
C-a
, ir al inicio de la líneaC-e
, ir al final de línea.C-u
, limpia la línea desde el inicio de la línea hasta la posición actual.C-c
, para el proceso.C-S-c
, copia el texto seleccionado.C-S-v
, pega el texto seleccionado.C-z
, para el proceso.C-d
, en una línea en blanco, es igual queexit
. Si tiene texto, borra un carácter.C-k
, borra de la posición del cursor al final de la línea.C-b
, mueve el cursor un carácter hacia atrás.M-b
, mueve el cursor una palabra para atrás.C-f
, mueve el cursor un carácter hacia delante.M-f
, mueve el cursor una palabra hacia delante.C-h
, borra la letra antes del cursor.C-w
, borra la palabra antes del cursor.C-p
, sube una línea, es decir, ve el último comando realizado.C-n
, bajar una línea o ir al comando siguiente.
Scrolls through the commands you’ve entered previously. Takes you back to a more recent command. Enter When you have the command you want. tab A very useful feature. It autocompletes any commands or filenames, if there’s only one option, or else gives you a list of options. Ctrl + R Searches for commands you’ve already typed. When you have entered a very long, complex command and need to repeat it, using this key combination and then typing a portion of the command will search through your command history. When you find it, simply press Enter. The history command shows a very long list of commands that you have typed. Each command is displayed next to History a number. You can type !x to execute a previously typed command from the list (replace the X with a number). If you history output is too long, then use history | less for a scrollable list. Example: you ran history and found you want to use command 1967. Simply enter !1967
Lista los archivos del punto en el que nos encontramos. Viene del inglés list. Si lo lanzamos sin argumentos, obtendremos un listado de los archivos y directorios que contiene ese directorio:
ls
ls [opciones]
lista los archivos del punto en el que nos encontramos.
-a
, lista todos los archivos.-l
, lista en formato largo
Para emplear argumentos, utilizaremos la estructura:
ls -a
Si queremos saber la información de cada archivo y directorio, lo
haremos con la opción -l
:
ls -l
pwd
es el acrónimo de print working directory o muestra por pantalla el directorio de trabajo actual.- Es decir, imprime la ruta absoluta del sistema donde nos encontramos.
pwd
- Para crear un directorio, usamos
mkdir
, make directory mkdir [opciones] [nombre-directorio]
- Con
cd
cambiamos de directorio - Viene de las iniciales del inglés change directory.
- Si escribimos solo
cd
, vamos a nuestro espacio home definido en la variable de entornoHOME
.
Para cambiar de directorio, podemos elegir la ruta absoluta o la relativa.
cd [ruta]
cd
, vamos a la home del usuariocd .
, vamos al directorio en el que estamos.cd ..
, vamos al directorio superiorcd ~
, vamos al directorio home del usuario.cd -
, vamos al directorio donde estábamos antes.
Con esos atajos también podemos construir rutas, por ejemplo, con cd
~/Documentos
vamos al directorio Documentos del usuario con el que
estamos (en un ordenador con GNU/Linux)
cd [ruta]
, change directory, cambia al directorio elegido. Podemos escribir la ruta absoluta o bien con atajos:
cd
, vamos a la home del usuariocd .
, vamos al directorio en el que estamos.cd ..
, vamos al directorio superiorcd ~
, vamos al directorio home del usuario.
Con esos atajos también podemos construir rutas, por ejemplo, con cd ~/Documentos
vamos al directorio Documentos del usuario con el que estamos.
- Podemos saber las variables que manejamos con el comando
env
- Si dirigimos la salida al filtrado con
grep
de la palabraHOME
ohome
Luego explicaremos lo que hacemos aquí:
env | grep HOME
Con touch [archivo]
, creamos archivo vacío, lo mismo que con mkdir
creamos un directorio.
Con cp
copiamos archivos y/o directorios.
cp [opciones] [origen] [destino]
- Con
cp -r
copia los directorios recursivamente - Si queremos copiar varios archivos/directorios en un directorio, el último que ponemos es el destino.
Con mv
un archivo o directorio completo. También sirve para
renombrar, aunque para esto tenemos a rename
.
mv [origen] [destino]
https://upload.wikimedia.org/wikipedia/commons/7/70/Stdstreams-notitle.svg
Para saber de los procesos de entrada y salida de datos, conviene saber de POSIX. ¿Qué es POSIX? Es lo que hace diferente Unix de Windows, es lo que te complica o te facilita la vida si quieres una compatibilidad en las operaciones que puedes hacer a nivel de sistema operativo.
POSIX es el acrónimo de Portable Operating System Interface (Interfaz de Sistema Operativo Portable), y la X viene de UNIX como seña de identidad de la API.
Como anécdota, decir que el nombre fue sugerido por Richard Stallman, fundador del proyecto GNU, cuando en 1980 pertenecía al comité del IEEE (Institute of Electrical and Electronics Engineers, Instituto de Ingenierxs Electrónicxs y Eléctricxs) que desarrolló el protocolo finalmente conocido como POSIX.
Se trata de una familia de estándares que pretenden mantener la compatibilidad entre sistemas operativos. POSIX define la API, así como la línea de comandos y otras interfaces necesarias.
Cada proceso en estos entornos suele disponer de tres archivos abiertos al comienzo de su ejecución:
- La entrada
- La salida
- La salida de errores.
El hecho de ser estándares es porque suelen estar asignados a descriptores de archivos conocidos, de manera que un programa:
- Siempre tomará los datos de entrada por el descriptor cero 0.
- Enviará los resultados por el descriptor uno 1.
- Mostrará los errores por el descriptor dos 2.
Para referirnos a ellos, se les denomina:
- La entrada, STDIN (STanDard INput, entrada estándar).
- La salida, STDOUT (STanDard OUTput, salida estándar).
- La salida de errores, STDERR (STanDard ERRor, salida estándar de errores).
Esta convención no tiene mucho sentido en sistemas gráficos o en programas que funcionan con demonios, pero alcanzan todo su potencial con la terminal.
La terminal o emulador de terminal es el programa que nos conecta con la shell del sistema, el intérprete de comandos del sistema operativo.
- La entrada de datos suele ser el teclado
- La salida típica suele ser la pantalla
- La salida de errores suele suplir a la salida típica, en caso de que se produzcan errores en la ejecución del comando.
Estos procesos se pueden modificar:
- Podemos redirigir la salida a un archivo.
- O bien dirigir la entrada a un comando.
- O redirigir una salida a una entrada.
Quienes trabajáis habitualmente con Github, quizás os suene cuando creáis un repositorio nuevo que entre las opciones para hacerlo, dice:
...or create a new repository on the command line echo "# prueba-borrar" >> README.md
Lo que aquí proponen es utilizar el comando echo
, que como su nombre
indica nos devuelve lo que le digamos, y dirigir la salida a un
archivo.
Si escribimos echo hola
, la salida del comando por la salida típica,
que es la pantalla, será hola
:
echo "hola"
Com proponían en Github, si le decimos a echo
que devuelva hola
pero queremos incluirlo en un archivo de nombre README.md
, haremos:
echo hola > README.md
Como escribíamos en el ejemplo anterior, el carácter >
redirecciona
la salida típica o STDOUT
al archivo README.md
.
¿Lo crea? ¿Lo destruye?
- Si no existía ese archivo, efectivamente, lo crea con
hola
como
contenido.
- Si existía, lo sobreescribe con
hola
como contenido.
Si no queremos sobreescribirlo, porque ya existía, sino añadir
contenido a ese archivo, en vez de >
utilizaremos >>
:
Como ya he creado con el ejemplo anterior el archivo README.md
con
el contenido hola
, ahora voy a añadir ¿qué tal
:
echo qué tal >> README.md
Para comprobarlo, hacemos un more
:
more README.md
Aunque aquí no hemos usado comillas, es recomendable introducir el texto entre comillas, así nos evitamos que haya palabras reservadas que empleemos en la frase:
echo "pues muy bien, gracias" >> README.md
Así añadiremos una tercera línea a README.md
con ese texto.
En io-redirection, hacen un buen repaso:
Redirección de STDOUT
a archivo
, donde lo crea o lo sobreescribe:
comando 1> archivo
Redirección y añadido de STDOUT
a archivo
:
comando 1>> archivo
Redirección de STDERR
a archivo
:
comando 2> archivo
Redirección de STDERR
y se añade al final del archivo
:
comando 2>> archivo
Redirección de STDOUT
y STDERR
a archivo
:
comando &> archivo
En sentido contrario a STDOUT
, podemos hacer que un comando ejecute
un archivo ya creado:
comando < archivo
Para redirigir un comando con otro utilizamos el carácter de barra vertical |
que representa la tubería: entubar/dirigir un comando a otros.
comando1 | comando2 | comando3
Los comodines permiten usar valores conocidos con valores comodín.
Hay tres operadores:
*
, para cualquier número de caracteres.?
, para un carácter.[x-y]
, para un rango.
Podemos listar todos los csv
con el comodín *
, ya que puede haber
archivos con un carácter o varios.
ls *.csv
De esta manera listaremos todos los archivos csv
, pero también #+BEGIN_SRC sh :output org
ls *.csv
El comodín ?
sirve para solo un carácter, cualesquiera. Por ejemplo,
si tuviéramos archivos que solo difieren en un carácter, podemos
listar ambos.
Imaginemos que tenemos archivos 1.pdf
, 2.pdf
, 3.pdf
,
etc. Podríamos listarlos con el comodín ?
:
ls ?.pdf
El comodín corchetes cuadrados o []
permite buscar rangos de números
o letras.
si queremos buscar en el csv
tanto CLESA
como BLESA
, podemos
escribir:
grep [B-C]LESA black-is-black.csv | wc -l
top
, sirve para ver qué procesos consumen más.ps [comando]
informa de los procesos de ese comando.ps -f
, lista completaps -e
, muestra todos los procesosps aux | grep [comando]
, muestra los procesos de ese comando
comando &
, corre proceso por detrás, en el background.jobs
, muestra procesos que corren por detráskill señal numero-proceso
, manda la señal determinada a ese procesokillall comando
, mata todos los procesos de ese comando
- Los archivos/directorios pertenecen al usuario, del grupo y de otros
- Las opciones de cada cual son lectura
r
read, escrituraw
write y ejecuciónx
execute u
, por user, usuariog
, por group, grupoo
, por others, otrosa
, por all, todos
Literalmente, change mode (cambia el modo) para un archivo o
directorio. La estructura es chmod [opciones] [modo] [destino]
Si queremos poner un tipo de permisos, podemos hacerlo con el operador ===
chmod a=rx *
De esta forma pondremos permisos de escritura y ejecución para todos, y quitaremos los de escritura si los tenía, a todos los archivos y directorios del directorio.
Para dar permisos de escritura y ejecución a todos los archivos y subdirectorios por debajo de ese directorio:
chmod +rx *
Si con +
damos permisos, con -
quitamos:
chmod g-w .
Quita los permisos de escritura al grupo en el directorio en el que nos encontramos.
Otra forma de otorgar permisos es con la relación numérica. Dado que tenemos tres tipos de usuarios y tres tipos de permisos, se puede crear una matriz con los permisos:
rwx rwx rwx = 111 111 111 rw- rw- rw- = 110 110 110 rwx --- --- = 111 000 000
Lo que significa:
rwx = 111 en binario = 7 rw- = 110 en binario = 6 r-x = 101 en binario = 5 r-- = 100 en binario = 4
Por tanto, el valor se corresponde con:
rwx rwx rwx = 321 321 321 rw- rw- rw- = 320 320 320 rwx --- --- = 321 000 000
Así, si quisieramos dar todos los permisos al archivo hola.txt
, haríamos:
chmod 777 hola.txt
En la propia terminal tienes opciones de perfiles de color que puedes usar o variables:
Especifica las variables que se exportan a todos los procesos que son reproducidos por el shell.
Se utiliza el comando export
para exportar una variable:
export VARIABLE=value
Para comprobar las variables, lanzaremos el comando env
:
env
Si quieres cambiar el aspecto del bash y que no aparezca todo el chorro de carpetas en las que te encuentras y que convierte tu línea en algo difícil de utilizar, cámbialo:
#PS1='[\u@\h \W]\$ ' # Default PS1='\[\e[1;31m\][\u@\h \W]\$\[\e[0m\] '
Ahí elegimos, en el primer subcorchete, el color (ver la lista de
colores completa), como por ejemplo \e[1;31m
, color rojo y en
negrita o bldred
.
El primer número se refiere a que sea texto normal, en cursiva, en negrita o subrayado.
- 1, para que aparezca en negrita
- 2, aparece normal
- 3, aparece en cursiva
- 4, para que aparezca subrayado
Si queremos probarlo en la terminal, podemos utilizar el comando echo
:
echo -e "${txtblu}test"
Se puede ver el listado de caracteres que escapan.
En este caso, en el segundo subcorchete definimos:
- Con
\u
, que aparecerá el nombre del usuarix. - Con
@
que aparecerá una arroba - Con
\h
que aparecerá el nombre del host. \W
indica que se pondrá el directorio de trabajo relativo o current relative path, si no estás en~/
. Si quisiéramos la ruta absoluta emplearíamos\w
Probablemente tengamos activada en la terminal la opción autocompletado, que podemos ver con estas líneas o parecidas en el archivo .bashrc
:
# enable programmable completion features (you don't need to enable # this, if it's already enabled in /etc/bash.bashrc and /etc/profile # sources /etc/bash.bashrc). if ! shopt -oq posix; then if [ -f /usr/share/bash-completion/bash_completion ]; then . /usr/share/bash-completion/bash_completion elif [ -f /etc/bash_completion ]; then . /etc/bash_completion fi fi
Por tanto, podríamos pulsar dos veces el tabulador cuando empecemos a escribir un comando y la terminal autocompletará.
La estructura al ejecutar en la mando siempre es la misma:
nombre-de-comando opciones argumentos
Si queremos saber qué hace un comando, hay tres opciones, dos comandos
que aportan información sobre los otros comandos y una opción de cada
comando: whatis
, --help
y man
.
whatis
muestra un par de líneas a lo sumo sobre el comando, de la
información que aparece en el manual.
Por ejemplo, si queremos saber qué hace el comando wc
, haremos
whatis wc
:
whatis wc
La ayuda suele estar en inglés.
Sobre cualquier comando, con la opción --help
nos muestra una versión reducida del manual:
wc --help
El comando man
con el nombre del comando como argumento del que se
quiere saber nos abre el paginador del manual del comando, normalmente
el comando more
.
Para avanzar en el paginador, hay que darle a la barra espaciadora y
para salir del paginador sin llegar al final, hay que pulsar la tecla
q
.
Si quieres ver el manual de wc
, escribirimos:
man wc
Para interrrumpir el curso de un comando, se puede pulsar a la vez las
teclas de Ctrl
y c
.
Ctrl + c
Para que esto no suponga un lío, lo habitual es presionar primero la letra
Ctrl
y, sin soltarla, pulsarc
una vez. Luego soltar en orden inverso, primero lac
y luegoCtrl
.
Para limpiar la línea con algo que hemos escrito y podríamos borrar
con la tecla de Backspace
, podríamos pulsar la combinación de teclas
Ctrl
+ u
.
Ctrl + u
Se puede salir de la sesión con el comando exit
o con la combinación
de teclas Ctrl
más d
.
Con el comando screen
podemos abrir una terminal virtual dentro de
la sesión, de tal forma que podemos ejecutar comandos en segundo plan
o, como por ejemplo un ping
, una descarga de un fichero con curl
(ver más adelante) o
cualquier otra orden o conjunto de órdenes.
Para lanzarlo, escribimos screen
y entonces pide que continuemos con
space
o salgamos con return
.
Una vez que hemos continuado con space
, podemos lanzar el comando
que queramos tener en segundo plano, como por ejemplo, ping
. Para
dejarlo en segundo plano, se teclea Ctrl
+ a
+ d
.
Ctrl + a + d
Si queremos saber los comandos que tenemos en segundo plano, se pueden
ver con screen -ls
.
Si solo tenemos un screen lanzado, podremos volver con screen -r
,
pero si tenemos varios, que se mostrarán con screen -ls
, podremos
volver al que nos interese con screen -r
más el número que nos
aparece en el listado.
Para cerrar la terminal virtual se utiliza también el comando exit
.
Se pueden hacer alias de los comandos e incluirlos en .bashrc
. Por ejemplo:
Un alias de ls
para que siempre que lo invoquemos haga ls -aF --color
:
alias ls='ls -aF --color=always'
O un comando nuevo, por ejemplo ll
, que lanza ls -l
:
alias ll='ls -l'
Podemos renombrar un comando, como por ejemplo que grep
sea search
:
alias search=grep
O que al escribir ..
subamos un directorio con cd ../
:
alias ..='cd ../'
history
muestra los comandos usados.- Esta lista se encuentra en el archivo (oculto)
.bash_history
history -c
limpia la historiahistory |grep [comando]
, muestra la historia de ese comando- Si la línea 2001 es la del comando que queremos utilizar, podemos
escribir
!2001
- Podemos utilizar uno de los comandos anteriores haciendo una
búsqueda recursiva con
CTRL + r
- Inmediatamente después ponemos el comando que queramos utilizar.
- La primera opción será la última que utilizamos con ese comando o más bien con esa cadena de caracteres en la ejecución de cualquier comando.
- Es decir, la búsqueda no solo la hace sobre el comando utilizado
sino también sobre cualquier texto de
.bash_history
. - Si la primera búsqueda no nos gusta, podemos seguir escribiendo para ser más concretos.
- Si eso no nos devuelve lo deseado, también podemos volver a teclear
CTRL + r
para ir hacia las búsquedas similares que hubo más atrás.
time [comando]
, muestra el tiempo de ejecución del comando, es
decir, el tiempo que tarda en ejecutarse.
diff
compara archivos línea por línea.
Lo primero que nos podemos preguntar cuando nos enfrentamos a un
archivo es saber cuánto pesa, cuántas palabras tiene y, si se trata de
un CSV
, cuántas líneas tiene.
Para ello utilizamos wc
, que responde a word count, contar
palabras, y es de mucha utilidad tanto por separado como en
combinación con otros comandos.
El esquema de uso sería:
wc [opciones] archivo
Algunas opciones son:
-l
, cuenta líneas-c
, cuenta bytes-m
, cuenta carácteres-w
, cuenta palabras
¿Cuántas líneas, palabras y bytes tiene el archivo 155-colegios-publicos-valencia-amianto.csv
wc data/155-colegios-publicos-valencia-amianto.csv
Lo cual nos da las líneas, palabras y bytes que tiene:
156 764 5253
Si queremos contar solo las líneas, lo haremos con la opción -l
:
wc -l data/155-colegios-publicos-valencia-amianto.csv
Lo cual como resultado, 156
.
Lo mismo haríamos con las palabras pero esta vez con la opción -w
en
vez de -l
:
wc -w data/155-colegios-publicos-valencia-amianto.csv
Con lo que obtenemos 764
Cuando queremos saber el número de caracteres, la opción es -m
wc -m data/155-colegios-publicos-valencia-amianto.csv
5119
caracteres en total, un número lígeramente inferior a los
5253
bytes que tiene el archivo.
Si queremos contar solo las líneas, lo haremos con la opción -l
:
wc -l rera_aragon.csv
wc -c rera_aragon.csv
wc -w rera_aragon.csv
wc -m rera_aragon.csv
El número de bytes está bien saberlo, pero igual queremos una lectura
a la que estemos más acostumbradxs, como por ejemplo, en Kilobytes
o
Megabytes
.
Para ello podemos utilizar du
, que resume el espacio en disco de un
archivo, directorio o conjunto de directorios.
Para obtener esos datos en un formato de lectura comprensible,
utilizamos la opción -h
Otra opción interesante es -s
, que hace un resumen.
Así, si queremos saber cuánto pesa el directorio en el que nos encontramos, escribiremos:
du -sh .
Ahora que ya sabemos cuánto pesa y qué caracteres o palabras tiene el archivo, igual nos interesa echar un vistazo al archivo.
Esto lo podemos hacer con varios comandos. Uno de ellos es head
, que
muestra las diez primeras líneas de un archivo.
head data/155.csv
Ahí vemos:
- Que la primera línea es la cabecera de la tabla
- Que tiene dos columnas
- Aunque parece que la segunda está vacía, luego puede significar que no se han pasado los datos que correspondían a esa columna.
Si queremos un número de líneas distintas, tan solo tenemos que ponerlo como opción antes del argumento del comando.
Por ejemplo, si solo queremos 4 líneas:
head -4 data/155.csv
Si head
nos muestra las primeras líneas de un archivo, el
comando tail
muestra las últimas.
tail data/155.csv
Y también podemos modificar el número de líneas que salen
especificándolo antes del argumento con la opción -n
o directamente
con el número de líneas como opción:
Por ejemplo, si queremos las dos últimas líneas:
tail -2 data/155.csv
tail -n2 data/155.csv
Podemos ver todo el archivo con cat
, que es un comando que sirve
para concatenar archivos y que veremos luego, pero que de forma simple
nos muestra por la salida estándar todo el archivo.
Si es muy largo, no vamos a ver más que las últimas líneas, las que quepan en la pantalla, ya que no se va a detener hasta el final.
cat data/155.csv
Por eso se suelen utilizar paginadores, que son como lectores para
documentos de texto. Los más empleados son more
y less
.
- Con more vemos un archivo de texto paginado.
- Podemos hacer búsquedas.
- Cuando queramos parar, podemos pulsar
q
.
Vistos estos dos comandos, head
y tail
, se pueden combinar para
que la salida de uno sirva como entrada de otro, y de esta manera,
saber qué contiene una línea en concreto.
La concatenación de comandos lo hacemos con la tubería |
. La tubería
o pipe sirve para pasar la ejecución de un comando a otro.
Si quisiéramos saber el contenido de la línea número treinta del
fichero, mostraríamos las 30 primeras líneas con head -30
y lo
concatenaríamos con tail -1
para saber la última de esas 30 primeras
líneas:
head -30 data/155.csv | tail -1
De esta manera podemos acceder, por ejemplo, a las filas 30 a 40:
head -40 data/155.csv | tail -10
Son un conjunto de comandos que buscan patrones en el texto de los archivos: grep
,
egrep
, fgrep
, rgrep
.
El comando grep
responde a global regular expresion print, es
decir, imprime el resultado de una expresión regular global. Sirve
para buscar archivos que respondan a la cadena o string
que
aportemos.
Empieza por la primera línea del archivo, donde grep
copia una línea
en un buffer, lo compara contra la cadena de búsqueda y si la
comparación pasa, imprime la línea en pantalla.
grep
repetirá este proceso hasta que el archivo recorra todas las
líneas.
Nótese que en este proces, grep
no almacena ni cambia las líneas ni
tampoco busca una sola parte de la línea.
Por ejemplo, si queremos buscar Elx
, que hemos visto que es una
localidad que aparece en el conjutno de datos que estamos explorando,
lo haremos con el texto entre comillas, y nos mostrará los resultados:
grep "Oriola" data/155.csv
No tenemos que ponerlo entre comillas pero así nos aseguramos que lo lea mejor
Si nos interesaran los números que aparecen en estos datos, podríamos hacer una búsqueda de cuántas líneas contienen números:
grep [0-9] data/155.csv
Para contar esos resultados, le añadimos la opción -c
grep -c "Elx" data/155.csv
Si queremos que salga el número de línea donde aparece la expresión
buscada, podemos hacerlo con la opción -n
:
grep -n "Santa Pola" data/155.csv
Para dar opciones de búsqueda, operador lógico OR
, caben varias
opciones a utilizar:
- El operador lógico
\|
- Utilizar la combinación
|
pero con la opción-E
egrep
grep
con-e
y-e
grep "Santa Pola\|Oriola" data/155.csv
Y para contarlo, lo mismo que antes:
grep -c "Santa Pola\|Oriola" data/155.csv
Añadimos c
a las opciones para que no salgan los resultados sino que
los cuente.
grep -cE "Alacant|Elx" data/155.csv
egrep
es lo mismo que grep -E
. Añadimos la opción c
para que
muestre las veces que aparece.
egrep -c "Alacant|Elx" data/155.csv
Lo mismo pero cada vez que filtramos ponemos la palabra tras la opción
e
y al final, c
.
grep -e "Elx" -e "Alacant" data/155.csv -c
Aunque no hay operador AND
en grep
, podemos hacerlo de varias
maneras:
- Con la opción
-E
y separando las cadenas con.*
: - Encadenando
grep
grep -E "Elx.* CP" data/155.csv
Nos dará por la salida estándar cuántos colegios públicos de Elx hay.
grep -E "Elx" data/155.csv | grep -Ec "CP"
26 son los colegios públicos (CP) de Elx.
Con el uso de la opción -v
se pueden simular condiciones NOT
.
La opción -v
es para búsquedas inversas, es decir, busca todas las
líneas excepto las que cumplan este patrón. Por ejemplo:
grep -vEc "CP|IES" data/155.csv
31 centros no son ni CP ni IES.
Si queremos buscar los centros que no sean CP o IES de Elx y Oriola:
grep -vE "CP|IES" data/155.csv | grep -Ec "Elx|Oriola"
Con cut
extraemos secciones de un archivo, según las opciones:
c
, para caracteres.d
, para delimitadores concretos.z
, para terminaciones.
Si quisiéramos extraer los primeros tres caracteres del archivo:
cut -c1-4 data/155.csv
Eso nos resolvería si el identificador de instalación fuera siempre del mismo número de caracteres.
Considerado un conjunto de datos con un delimitador, podemos
identificar n
campos.
En el caso que nos ocupa, dado que tenemos un espacio entre la identificación de la instalación y su nombre, podríamos seleccionar el primer campo de datos, el de identificación, si consideramos el espacio en blanco como delimitador.
cut -f 1 -d ' ' data/155.csv
Parece que hemos conseguido seleccionar algunos de los identificadores, independientemente del número de caracteres que contengan, por lo que vamos a guardar la selección en un archivo:
cut -f 1 -d ' ' data/155.csv > data/id-cut-c.csv
Y para verlos:
head -n5 data/id-cut-c.csv
Vemos que nos selecciona bien algunas líneas (CP, CEIP) pero otras no
(Colegio). Esto es porque Colegio Público
está escrito también como
CP, por lo que podríamos reemplazar esa cadena por CP para que esta
operación nos salga bien.
Lo contrario que cut
Breaks long input lines. The primary use is formatting, but fold is sometimes useful in linguistic text processing. For example, if you need to get each character onto a line by itself, the command
fold -w 1
, which sets the line length to one character, will do the job. GNU fold understands Unicode.
Sed es un editor del flujo de datos que permite filtrar y transformar texto.
Si queremos unificar nuestro documento y que cuando aparece Colegio
Público
aparezca CP
, hacemos:
sed 's/Colegio Público/CP/g' data/155.csv > data/155-sed-cp.csv
Como he enviado la salida a un archivo, no lo veo por aquí, Para
explorarlo, voy a volver a ver como antes las 5 primeras líneas con
head
:
head -n5 data/155-sed-cp.csv
Ya no tenemos la cadena Colegio Público
porque la hemos sustituido
con sed
por CP
.
Lo que hemos hecho antes ha sido utilizar sed
con la opción
regexp
, es decir, expresiones regulares.
Con sed
se utilizan de esta manera:
sed s/regexp/reemplazo/
Repasando el archivo con more
también observo unas comillas que pueden
molestar, que podríamos quitar con una nueva expresión regular:
sed 's/"//g' data/155-sed-cp.csv > data/155-sed-comillas.csv
sed -n '/Orio/p' data/155.csv
sed -r 's/(cadena1)(cadena2)/\2\1/g
Aunque no hay un delimitador, de datos en columnas, sí que hay un dato entre paréntesis, la localidad (en casi todos los casos).
Vamos a sacar el texto de los paréntesis:
cut -f 2 -d '(' data/155-sed-comillas.csv > data/155-cut-parentesis-2.csv
Y ahora borramos la parte final, que siempre es ),
con sed
:
sed 's/),//g' data/155-cut-parentesis-2.csv > data/155-sed-lugar.csv && head -5 data/155-sed-lugar.csv
Y vamos a sacar el texto de antes de los paréntesis
cut -f 1 -d '(' data/155-sed-comillas.csv > data/155-cut-parentesis-1.csv && head -5 data/155-cut-parentesis-1.csv
Y ahora seleccionamos la primera cadena, el tipo de colegio, de la misma manera:
cut -f 1 -d ' ' data/155-cut-parentesis-1.csv > data/155-cut-parentesis-0.csv && head -5 data/155-cut-parentesis-0.csv
Hemos conseguido tres CSV con tres tipos de datos: tipo de colegio, nombre de colegio y localidad.
Pero además, en las localidades, en algunas aparece la pedanía, separada por un guión, por lo que podríamos operar igual, pero al no estar en todas las líneas, no funciona:
cut -f 2 -d '-' data/155-cut-parentesis-2.csv > data/155-cut-parentesis-3.csv && grep -n ')' data/155-cut-parentesis-3.csv
Dado que estoy limpiando los archivos, en este último quitaré la primera línea que como he visto antes contiene la cabecera del conjunto de datos, es decir:
head -1 data/155-sed-lugar.csv
La cabecera con Colegios
en la primera columna y Localidad
en la
segunda no me estaba funcionando dado que todos los datos estaban en
la primera columna.
Para eliminar esta fila, lo hacemos con la opción de sed
'1d'
.
sed '1d' data/155-sed-lugar.csv > data/155-sed-lugar-limpio.csv
Comprobamos:
head -1 data/155-sed-lugar-limpio.csv
Si hubiera una o más líneas en blanco, podríamos eliminarlo con:
sed '/^$/d' data/155-sed-lugar-limpio.csv
Si quisiéramos eliminar líneas que contengan algunos de los signos de
comentar al inicio, como por ejemplo una almohadilla #
en Perl, Python, Ruby o
R, haremos:
sed '/ *#/d; /^$/d; / *\*/d' data/prueba-sed.txt > data/prueba-sed-post.txt
Lo malo de este ejemplo es si se han escrito comentarios de bloque y no de línea, pero no dejemos que ese supuesto arruine este ejemplo ;-)
sed 's/"/\\\"/g; s/^/"/; s/$/"/; s/ctrl-V<TAB>/","/g;' origFile.tsv > newFile.csv
Otro ejemplo, concatenando tres comandos: head
, tail
y cut
:
Ya hemos hecho la concatenación de dos comandos, como por ejemplo ver
las líneas 15 a 20 con la combinación de head
(cabecera) y tail
(cola).
Primero sacamos los 20 primeras líneas y luego le decimos que de esas 20 primeras solo queremos las cinco últimas entubando los resultados del primer comando al segundo:
head -n20 data/155.csv | tail -n5
Si entubamos ese resultado a cut
con la opción c1-4
, obtenemos los
primeros cuatro caracteres de las líneas 15-20 de 155.csv
.
head -n20 data/155.csv | tail -n5 | cut -c1-4
El comando split
viene muy bien cuando estamos trabajando con un
fichero muy largo ya que permite dividrlo en varios.
Siguiendo con el ejemplo original, si quisiéramos dividir nuestro
fichero de 155 líneas en archivos de 10 líneas, podríamos hacerlo con
split
, ofreciendo la posibilidad de nombrarlos de forma especial:
split -l 10 data/155.csv data/diez_ && ls -a data/diez*
Si quisiéramos saber cuántos archivos hay, tendríamos que entubar ese
resultado por wc -l
, que nos contaría el número de líneas:
split -l 10 data/155.csv data/diez_ && ls -l data/diez* |wc -l
Veamos el contenido del último archivo:
more data/diez_ap
Si quisiéramos darles una extensión, podríamos renombrarlos o bien
utilizar en split
la opción --additional-suffix=SUFFIX
:
split -l 10 data/155.csv data/diez_ --additional-suffix=.csv && ls -l data/diez*.csv |wc -l
Con awk
podemos explorar una de esas columnas de datos del CSV
.
Vamos a empezar con el mismo archivo pero vamos a incorporar el de la actividad contractual del Ayuntamiento de Madrid, disponible en su portal de datos abiertos.
Podemos descargarlo con wget
o curl
:
wget -O contratos-madrid.csv http://datos.madrid.es/egob/catalogo/216876-20-contratos-actividad.csv
Si hacemos un file
al archivo, veremos si está bien:
file contratos-madrid.csv
La salida de este comando dice:
contratos-madrid.csv: Non-ISO extended-ASCII text, with very long lines, with CRLF line terminators
Parece que no está correctamente configurada su codificación de caracteres. De hecho, si vemos la primera fila:
Mes;A�o;Descripci�n Centro;Organismo;N�mero Contrato;N�mero Expediente;Descripci�n Contrato;Tipo Contrato;Procedimiento Adjudicaci�n;Art�culo;Apartado;Criterios Adjudicaci�n;Presupuesto Total (IVA Incluido);Importe Adjudicaci�n (IVA Incluido);Plazo;Fecha Adjudicaci�n;Nombre/Raz�n Social;NIF/CIF Adjudicatario;Fecha Formalizaci�n;Acuerdo Marco;Ingreso/Coste Cero;Observaciones;;;
Para convertir su codificación de caracteres emplearemos iconv
:
iconv --from-code=ISO-8859-1 --to-code=UTF-8 contratos-madrid.csv > contratos.csv
Donde le decimos que de la codificación en ISO-8859-1 lo convierta en UTF-8.
Antes lo hemos hecho con cut
, pero ahora veremos con awk
cómo ver
los datos de una columna.
Primero, vamos a ver qué separador utiliza el CSV:
head -1 data/contratos.csv
awk -F "(" '{print $2}' data/155.csv >> data/155-awk-localidad.csv
awk '{filename = "wrd." int((NR-1)/10000) ".txt"; print >> filename}' inputfile
El comando find
es un potente buscador sobre nuestros archivos y
carpetas/directorios.
Si estamos usando Cygwin, antes debemos modificar la variable
HOME
.
Como cualquier otro comando, su estructura comienza con el comando,
luego la ruta sobre la que deseamos buscar, las opciones de búsqueda y
finalmente la expresión que buscamos, find [ruta] [opciones]
[expresión]
.
Algunas opciones que tenemos son:
-name
, busca por nombre-size
, busca por tamaño.iname
, busca en modo sensitivo.atime
, la fecha/hora de la última modificación.- Permisos
- Propiedad
Si solo lanzamos find
, nos devolverá los archivos, directorios y
subdirectorios por debajo del lugar donde nos encontramos.
Miremos primero dónde nos encontramos, volvamos a pwd
:
pwd
Según el sistema operativo que utilicemos, esta orden nos devolverá rutas distintas: En GNU/Linux, como es mi caso:
/home/usuarix/proyectos/upv-periodismo-datos
En Windows:
c:\Users\Mengana\Documents\upv-periodismo-datos
En ese caso, si hacemos find
sobre este directorio, vamos a ver qué
contiene:
find
Nos devolverá:
- Archivos.
- Directorios.
- Archivos de los directorios
Se puede hacer find
también de dos formas:
find .
find . -print
.
Pero normalmente lo utilizaremos siguiendo esta estructura:
find ruta filtro-de-búsqueda término-de-búsqueda
Podemos poner otra ruta:
find ~/docs/softwarelibre/
Si queremos ver los archivos que tengo en la carpeta softwarelibre
que está dentro de docs
dentro de mi home
de usuarix.
Vamos a buscar ahora todos los archivos Readme.org
por debajo de un
directorio con la opción -name
y voy a entubar la salida con a wc -l
find ~/ownCloud/proyectos/ -name Readme.org | wc -l
Y también podemos incluir comodines. Por ejemplo, si quisiéramos todos los
archivos *.org
, no solo los que se llaman Readme.org
:
find ~/ownCloud/proyectos -name *.org | wc -l
Y si no queremos todos los archivos sino alguno en concreto, por ejemplo, que contuviera bash:
find ~/ownCloud/docs/softwarelibre -name *bash*.org
O tamaños de archivos:
find . -size +1M
O de directorios
find ~/ -folder +300M
O tipo de archivo:
find . -type f *.org
O encontrar archivos más antiguos que un año y borrarlos:
find .cache/ -type f -atime +365 -exec rm \;
Encontrar y ordenar
find ~/Descargas/ -size +30M | sort -hr
Y programar:
find ./ -name "*.png" | sort | while read file; do tesseract $file "`basename $file" | sed 's/\.[[:alnum:]]*$//'`.txt -l spa -psm 3; done
Donde:
- Encontramos los archivos del tipo
png
sobre la carpeta elegida - Los ordenamos con
sort
- Empezamos bucle con
while
- Ejecutamos
tesseract
(herramienta OCR) sobre cada archivo$file
- Cambiamos el nombre y el tipo a
txt
.
Se utiliza para manipular el texto.
Para convertir todo el texto en mayúsculas, empleamos:
cat data/prueba-sed.txt | tr '[:lower:]' '[:upper:]' > data/prueba-sed-upper.txt
- Podemos ejecutar un comando
- Pero también un comando y después otro
- O un comando y si tiene éxito entonces el segundo.
- Al reves, un comando si el primero no tuvo éxito.
Ejemplos
Si queremos ejecutar un comando y luego otro, independientemente de si
el primero da error, utilizamos el operador ;
En este ejemplo, la primera orden ofrece resultados, y por eso el
echo
tiene sentido:
grep BLESA black-is-black.csv | wc -l ; echo "líneas con la palabra BLESA...\n¡Qué pasada!"
En este ejemplo, no devuelve resultados porque no hay un archivo llamado black. Sin embargo, aparece el mensaje a continuación como en el primer caso, que resulta un poco incongruente.
grep CLESA black; echo "líneas con la palabra CLESA...\n¡Qué pasada!"
Si queremos ejecutar el comando, y que siga con el segundo sólo si el primero devuelve algo, utilizamos el operador &&:
grep CLESA black && echo "líneas con la palabra CLESA...\n¡Qué pasada!"
Al contrario, si queremos ejecutar un comando después de otro pero
queremos que se ejecute el segundo solo si el primero dio error,
usaremos el operador ||
:
grep CLESA black-is-black || echo "No hay ningún chorizo CLESA"
diff
Mostrar diferencias entre ficheros:
diff Black.csv Black_corrupcion.csv
Comparar dos archivos. Si son iguales, no devuelve nada, si difieren muestra el byte y el número de línea de la primera diferencia.
cmp Black.csv Black_corrupcion.csv
Para reemplazar
para unir líneas de archivos
para ordenar
Cuando se ofrece una entrada de datos ordenados, escribe una salida estándar con las líneas que son únicas.
Nos puede decir cuántas líneas están repetidas, las que no están repetidas o solo las que están repetidas.
for do
es una de las operaciones más simples y útiles que se pueden
realizar en la línea de comandos.
for f i $(iconv -l); do echo "Convirtiendo $f ..."; iconv -f $f -t UTF-8 > file_name.csv > file_name.$f.csv; done
dos2unix filedos.txt fileunix.txt
unix2dos fileunix.txt filedos.txt
recode ..HTML < page.txt > page.html
recode -l | more