the-art-of-command-line/README-es.md

470 lines
28 KiB
Markdown
Raw Normal View History

[ Languages: [English](README.md), [Español](README-es.md), [한국어](README-ko.md), [Português](README-pt.md), [Русский](README-ru.md), [Slovenščina](README-sl.md), [中文](README-zh.md) ]
2015-06-24 19:58:46 +02:00
# El Arte del Terminal
2015-07-03 20:52:22 +02:00
[![Join the chat at https://gitter.im/jlevy/the-art-of-command-line](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/jlevy/the-art-of-command-line?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
2015-06-24 19:58:46 +02:00
- [Meta](#meta)
- [Fundamentos](#basics)
- [De uso diario](#everyday-use)
2015-07-07 20:47:36 +02:00
- [Procesamiento de archivos y datos](#processing-files-and-data)
2015-06-24 19:58:46 +02:00
- [Depuración del sistema](#system-debugging)
- [One-liners](#one-liners)
- [Obscuro pero útil](#obscure-but-useful)
2015-07-15 20:47:35 +02:00
- [Solo para MacOS X](#macos-x-only)
2015-06-24 19:58:46 +02:00
- [Más recursos](#more-resources)
- [Advertencia](#disclaimer)
![curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '`\w+`' | tr -d '`' | cowsay -W50](cowsay.png)
2015-07-17 19:02:42 +02:00
La fluidez en el terminal es una destreza a menudo abandonada y considerada arcaica, pero esta mejora su flexibilidad y productividad como ingeniero en formas obvia y sutil. Esta es una selección de notas y consejos al usar el terminal que encontré útiles al trabajar en Linux. Algunos consejos son elementales y algunos bastante específicos, sofisticados u oscuros. Esta página no es larga, pero sí usa y recuerda todos los puntos aquí mostrados, ustedes sabrán un montón.
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
Gran parte está en
2015-06-24 19:58:46 +02:00
[originally](http://www.quora.com/What-are-some-lesser-known-but-useful-Unix-commands)
[appeared](http://www.quora.com/What-are-the-most-useful-Swiss-army-knife-one-liners-on-Unix)
en [Quora](http://www.quora.com/What-are-some-time-saving-tips-that-every-Linux-user-should-know),
2015-07-07 22:53:25 +02:00
pero debido al interés mostrado, parece que vale la pena usar Github, donde existen personas más talentosas, que fácilmente pueden sugerir mejoras. Si ve un error o algo que podría ser mejor, por favor, cree un issue o PR! (Por supuesto revise la sección meta de PRs/issues primero.)
2015-06-24 19:58:46 +02:00
## Meta
Alcance:
2015-07-07 20:47:36 +02:00
- Esta guía es tanto para el principiante como para el experimentado. Los objetivos son *diversidad* (todo importa), *especificidad* (dar ejemplos concretos del caso más común), y *concisión* (evitar cosas que no son esenciales o insignificantes que puedas buscar fácilmente en otro lugar). Cada consejo es esencial en alguna situación o significativamente ahorra tiempo comparada con otras alternativas.
2015-07-15 20:47:35 +02:00
- Esta escrito para Linux, con excepción de la sección "[Solo para MacOS X](#macos-x-only)". Muchos de los otros puntos aplican o pueden ser instalados en otros Unices o MacOS (o incluso Cygwin).
2015-07-07 20:47:36 +02:00
- Se enfoca en Bash interactivo, aunque muchos de los consejos se aplican para otros shells y al Bash scripting por lo general.
- Esta incluye ambos comandos "estándar" Unix, así como aquellos que requieren la instalación especial de un paquete -- siempre que sea suficientemente importante para ameritar su inclusión.
2015-06-24 19:58:46 +02:00
2015-06-25 23:30:19 +02:00
Notas:
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Para mantener esto en una página, el contenido está incluido implícitamente por referencia. Usted es suficientemente inteligente para ver profundamente los detalles en otros lugares, cuando conoces la idea o comando en Google. Usar `apt-get`/`yum`/`dnf`/`pacman`/`pip`/`brew` (según proceda) para instalar los nuevos programas.
2015-07-07 20:47:36 +02:00
- Usar [Explainshell](http://explainshell.com/) para obtener detalles de ayuda sobre que comandos, opciones, pipes, etc.
2015-06-24 19:58:46 +02:00
2015-06-28 22:48:37 +02:00
## Fundamentos
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Aprenda conocimientos básicos de Bash, de hecho, escriba `man bash` y al menos échele un vistazo a toda la cosa. Es bastante fácil de seguir y no es tan largo. Alternar entre shells puede ser agradable, pero Bash es poderoso y siempre está disponible (conocer *solo* zsh, fish, etc., aunque resulte tentador en tu propia laptop, los restringe en muchas situaciones, tales como el uso de servidores existentes).
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- Aprenda bien al menos un editor de texto, idealmente Vim (`vi`), como no hay realmente una competencia para la edición aleatoria en un terminal (incluso si usa Emacs, un gran IDE, o un editor alternativo (hipster) moderno la mayor parte del tiempo).
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Conozca como leer la documentación con `man` (Para curiosos, `man man` lista las secciones enumeradas, ej. 1 es comandos "regulares", 5 son archivos/convenciones, y 8 para administración). En en las páginas de man `apropos`. Conozca que alguno de los comandos no son ejecutables, pero son Bash builtins, y que puede obtener ayuda sobre ellos con `help` y `help -d`.
2015-06-24 19:58:46 +02:00
- Aprenda sobre redirección de salida >, entrada < y pipes utilizando `|`. Conozca que `>` sobrescribe el archivo de salida y `>>` añade. Aprenda sobre stdout y stderr.
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- Aprenda sobre expansión de archivos glob con `*` (y tal vez `?` y `{`...`}`) y quoting y la diferencia entre doble `"` y simple `'` quotes. (Ver más en expansión de variables más abajo.)
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- Familiarízate con la administración de trabajo en Bash: `&`, **ctrl-z**, **ctrl-c**, `jobs`, `fg`, `bg`, `kill`, etc.
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- Conoce `ssh` y lo básico de autenticación sin contraseña, vía `ssh-agent`, `ssh-add`, etc.
2015-06-24 19:58:46 +02:00
2015-07-10 11:02:37 +02:00
- Administración de archivos básica: `ls` y `ls -l` (en particular, aprenda el significado de cada columna en `ls -l`), `less`, `head`, `tail` y `tail -f` (o incluso mejor, `less +F`), `ln` y `ln -s` (aprenda las diferencias y ventajas entre enlaces hard y soft), `chown`, `chmod`, `du` (para un resumen rápido del uso del disco: `du -hs *`). Para administración de archivos de sistema, `df`, `mount`, `fdisk`, `mkfs`, `lsblk`.
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- Administración básica de redes: `ip` o `ifconfig`, `dig`.
2015-06-24 19:58:46 +02:00
2015-07-16 19:07:43 +02:00
- Conozca bien las expresiones regulares y varias opciones (flags) para `grep`/`egrep`. Las opciones `-i`, `-o`, `-v`, `-A`, y `-B` son dignas de ser recordadas.
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- Aprenda el uso de `apt-get`, `yum`, `dnf` o `pacman` (dependiendo de la distribución "distro") para buscar e instalar paquetes. Y asegúrate que tienes `pip` para instalar la herramienta de línea de comando basada en Python (un poco más abajo esta explicado como instalar vía `pip`).
2015-06-24 19:58:46 +02:00
2015-07-02 23:26:37 +02:00
## De uso diario
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- En Bash, se usa **Tab** para completar los argumentos y **ctrl-r** para buscar, a través del historial de comandos.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- En Bash, se usa **ctrl-w** para borrar la última palabra, y **ctrl-u** para borrar todo el camino hasta el inicio de la línea. Se usa **alt-b** y **alt-f** para moverse entre letras, **ctrl-a** para mover el cursor al principio de la línea, **ctrl-e** para mover el cursor al final de la línea, **ctrl-k** para eliminar hasta el final de la línea, **ctrl-l** para limpiar la pantalla. Ver `man readline` para todos los atajos de teclado por defecto en Bash. Son una gran cantidad. Por ejemplo **alt-.** realiza un ciclo a través de los comandos previos, y **alt-*** expande un glob.
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- Alternativamente, si amas los atajos de teclado vi-style, usa `set -o vi`.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Para ver los últimos comandos, `history`. También existen abreviaciones, tales como, `!$` (último argumento) y `!!` último comando, aunque son fácilmente remplazados con **ctrl-r** y **alt-.**.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Para volver al directorio de trabajo previo: `cd -`
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Si estás a mitad de camino de escritura de un comando pero cambias de opinión, presiona **alt-#** para agregar un `#` al principio y lo agrega como comentario (o usar **ctrl-a**, **#**, **enter**). Para que puedas entonces regresar a este luego vía comando `history`.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Se usa `xargs` (or `parallel`). Esto es muy poderoso. Nota: puedes controlar muchos elementos ejecutados por línea (`-L`), también es conocido como paralelismo (`-P`). Si no estas seguro, este puede ser el camino correcto, usa `xargs echo` primero. También, `-I{}` es cómodo. Ejemplos:
2015-06-24 19:58:46 +02:00
```bash
find . -name '*.py' | xargs grep some_function
cat hosts | xargs -I{} ssh root@{} hostname
```
2015-07-02 23:26:37 +02:00
- `pstree -p` es útil para mostrar el árbol de procesos.
2015-06-24 19:58:46 +02:00
2015-07-02 23:26:37 +02:00
- Se usa `pgrep` y `pkill` para encontrar o señalar procesos por su nombre (`-f` es de mucha ayuda).
2015-06-24 19:58:46 +02:00
2015-07-03 11:45:47 +02:00
- Conocer varias señales que puedes enviar a los procesos. Por ejemplo, para suspender un proceso, usa `kill -STOP [pid]`. Para la lista completa, consultar `man 7 signal`
2015-06-24 19:58:46 +02:00
2015-07-03 11:45:47 +02:00
- Usa `nohup` o `disown` si quieres mantener un proceso de fondo corriendo para siempre.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Verifica que procesos están escuchando vía `netstat -lntp` o `ss -plat` (para TCP; agrega `-u` para UDP).
2015-06-24 19:58:46 +02:00
2015-07-03 11:45:47 +02:00
- Consulta también `lsof` para abrir sockets y archivos.
2015-06-24 19:58:46 +02:00
2015-07-03 20:52:22 +02:00
- Usar `alias` para crear atajos para comandos comúnmente usados. Por ejemplo, `alias ll="las -latr"` crea un nuevo alias `ll`
2015-07-07 23:18:44 +02:00
- En scripts Bash, usa `set -x` para depurar la salida. Utiliza el modo estricto cuando se posible. Utiliza `set -e` para abortar en errores. Utiliza `set -o pipefail` también, para ser estrictos sobre los errores (aunque este tema es un poco delicado). Para scripts más complejos, también se puede utilizar `trap`.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- En scripts Bash, subshells (escritos con paréntesis) son maneras convenientes para agrupar los comandos. Un ejemplo común es para moverse temporalmente hacia un directorio diferente del de trabajo, Ej.
2015-06-24 19:58:46 +02:00
```bash
# do something in current dir
(cd /some/other/dir && other-command)
# continue in original dir
```
2015-07-17 19:02:42 +02:00
- En Bash, considere que hay muchas formas de expansión de variables. Verificar la existencia de una variable: `${name:?error message}`. Por ejemplo, si un script Bash requiere un único argumento, solo escriba `input_file=${1:?usage: $0 input_file}`. Expansión aritmética: `i=$(( (i + 1) % 5 ))`. Secuencias: `{1..10}`. Reducción de strings: `${var%suffix}` y `${var#prefix}`. Por ejemplo si `var=foo.pdf`, entonces `echo ${var%.pdf}.txt` imprime `foo.txt`.
2015-06-24 19:58:46 +02:00
2015-07-07 23:18:44 +02:00
- La salida de un comando puede ser tratado como un archivo, vía `<(some command)`. Por ejemplo, compare local `/etc/hosts` con uno remoto:
2015-06-24 19:58:46 +02:00
```sh
diff /etc/hosts <(ssh somehost cat /etc/hosts)
```
2015-07-03 11:45:47 +02:00
- Conocer acerca "here documents" en Bash, así también `cat <<EOF ...`.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- En Bash, redireccionar salida estándar y error estándar, via: `some-command >logfile 2>&1`. Frecuentemente, para garantizar que un comando no haya dejado abierto un archivo para controlar la entrada estándar vinculada al terminal en el que te encuentras y también como buena práctica puedes agregar `</dev/null`.
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- Use `man ascii` para una buena tabla ASCII, con valores hexadecimal y decimales. Para información de codificación general, `man unicode`, `man utf-8`, y `man latin1` son de utilidad.
2015-06-24 19:58:46 +02:00
2015-07-07 23:18:44 +02:00
- Use `screen` o [`tmux`](https://tmux.github.io/) para multiplexar la pantalla, especialmente útil en sesiones ss remotas y para desconectar y reconectar a una sesión. Una alternativa más minimalista para persistencia de la sesión solo sería `dtach`.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- En ssh, conocer cómo hacer un port tunnel con `-L` o `-D` (y de vez en cuando `-R`) es útil, Ej. para acceder sitio web desde un servidor remoto.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- esto puede ser útil para hacer algunas optimizaciones para su configuración ssh; por ejemplo, Este, `~/.ssh/config` contiene la configuración para evitar desconexiones en ciertos entornos de red, utiliza la compresión (cual es útil con scp sobre conexiones con un ancho de banda pequeña), y la multiplexión de los canales para el mismo servidor con un archivo de control local:
2015-06-24 19:58:46 +02:00
```
TCPKeepAlive=yes
ServerAliveInterval=15
ServerAliveCountMax=6
Compression=yes
ControlMaster auto
ControlPath /tmp/%r@%h:%p
ControlPersist yes
```
2015-07-03 11:45:47 +02:00
- Unas pocas otras opciones relevantes para ssh son are sensitivas a la seguridad y deben ser activadas con cuidado, Ej. "per subnet", "host" o "in trusted networks: `StrictHostKeyChecking=no`, `ForwardAgent=yes`
2015-06-24 19:58:46 +02:00
2015-07-07 23:18:44 +02:00
- Para obtener permiso sobre un archivo en forma octal form, el cual es útil para la configuración del sistema pero no disponible con `ls` y fácil de estropear, usando algo como
2015-06-24 19:58:46 +02:00
```sh
stat -c '%A %a %n' /etc/timezone
```
2015-07-03 20:52:22 +02:00
- Para selección interactiva de valores desde la salida de otro comando, usa [`percol`](https://github.com/mooz/percol) o [`fzf`](https://github.com/junegunn/fzf).
2015-06-24 19:58:46 +02:00
2015-07-03 11:45:47 +02:00
- Para la interacción con archivos basados en la salida de otro comando (como `git`), usa `fpp` ([PathPicker](https://github.com/facebook/PathPicker)).
2015-06-24 19:58:46 +02:00
2015-07-03 11:45:47 +02:00
- Para un servidor web sencillo para todos los archivos en el directorio actual (y subdirectorios), disponible para cualquiera en tu red, usa:
`python -m SimpleHTTPServer 7777` (para el puerto 7777 y Python 2) y `python -m http.server 7777` (para 7777 y Python 3).
2015-06-24 19:58:46 +02:00
2015-07-07 23:18:44 +02:00
- Para ejecutar un comando con privilegios, usando `sudo` (para root) o `sudo -u` (para otro usuario). Usar `su` o `sudo bash` para realmente ejecutar un shell como este usuario. Usar `su -` para simular un login fresco como root u otro usuario.
2015-07-03 20:52:22 +02:00
2015-06-24 19:58:46 +02:00
2015-07-03 13:13:53 +02:00
## Procesamiento de archivos y datos
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Para localizar un archivo por nombre en el directorio actual, `find . -iname '*something*'` (o similar). Para encontrar un archivo en cualquier lado por nombre, usar `locate something` (pero tenga en mente `updatedb` quizás no haya indexado recientemente los archivos creados).
2015-06-24 19:58:46 +02:00
2015-07-03 13:13:53 +02:00
- Por lo general buscar por la fuente o archivos de datos (más avanzado que `grep -r`), usar [`ag`](https://github.com/ggreer/the_silver_searcher).
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Para convertir HTML a texto: `lynx -dump -stdin`
2015-06-24 19:58:46 +02:00
2015-07-03 13:13:53 +02:00
- Para Markdown, HTML, y todos los tipos de conversión de documentos, probar [`pandoc`](http://pandoc.org/).
2015-06-24 19:58:46 +02:00
2015-07-03 13:13:53 +02:00
- Si debes manipular XML, `xmlstarlet` es viejo pero bueno.
2015-06-24 19:58:46 +02:00
- Para JSON, usa [`jq`](http://stedolan.github.io/jq/).
2015-06-24 19:58:46 +02:00
2015-07-03 13:13:53 +02:00
- Para archivos Excel o CSV, [csvkit](https://github.com/onyxfish/csvkit) provee `in2csv`, `csvcut`, `csvjoin`, `csvgrep`, etc.
2015-06-24 19:58:46 +02:00
2015-07-03 13:13:53 +02:00
- Para Amazon S3, [`s3cmd`](https://github.com/s3tools/s3cmd) es conveniente y [`s4cmd`](https://github.com/bloomreach/s4cmd) es el mas rápido. Hecho por Amazon [`aws`](https://github.com/aws/aws-cli) es esencial para otras tareas relacionadas al AWS.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Conocer acerca `sort` y `uniq`, incluyendo opciones de uniq `-u` y `-d` -- ver unas líneas más abajo.
2015-06-24 19:58:46 +02:00
- Conocer acerca `cut`, `paste` y `join` para manipular archivos de texto. Muchas personas usan `cut` pero se olvidan acerca de `join`.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Conocer acerca `wc` para contar nuevas líneas (`-l`), caracteres (`-m`), palabras (`-w`) y bytes (`-c`).
2015-06-24 19:58:46 +02:00
2015-07-03 13:13:53 +02:00
- Conocer acerca `tee` para copiar desde el stdin hacia un archivo y también hacia el stdout, así `ls -al | tee file.txt`.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Conocer que `locale` afecta muchas herramientas de línea de comando en forma delicada, incluyendo el orden del ordenamiento (compaginación) y rendimiento. La mayoría de las instalaciones de Linux configuran `LANG` u otras variables de localización para la configuración local como US English. Pero esté alerta, el ordenamiento puede cambiar si cambia la localización. Y también las rutinas i18n pueden hacer que `sort` u otros comandos se ejecuten **muchas veces** más lentos. En algunas situaciones (tales como la realización de operaciones u operaciones singulares debajo) puede de forma segura ignorar las rutinas lentas i18n por completo y utilizar el sort tradicional basado en byte, usando `export LC_ALL=C`.
2015-06-24 19:58:46 +02:00
2015-07-07 22:53:25 +02:00
- Conozca aspectos básicos de `awk` y `sed` para manejo de datos. Por ejemplo, sumar todos lo números en la tercera columna de un archivo de texto: `awk '{ x += $3 } END { print x }'`. Esto es probablemente 3X más rápido y 3X más corto que su equivalente en Python.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Para reemplazar todas las ocurrencias de un string en su lugar, en uno o más archivos:
2015-06-24 19:58:46 +02:00
```sh
perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
```
2015-07-07 20:47:36 +02:00
- Para renombrar varios archivos a la vez de acuerdo a un patrón, usar `rename`. Para renombramientos complejos, [`repren`](https://github.com/jlevy/repren) may help.
2015-06-24 19:58:46 +02:00
```sh
# Recover backup files foo.bak -> foo:
rename 's/\.bak$//' *.bak
# Full rename of filenames, directories, and contents foo -> bar:
repren --full --preserve-case --from foo --to bar .
```
2015-07-07 22:53:25 +02:00
- Usar `shuf` para mezclar o seleccionar líneas aleatorias desde un archivo.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Conozca las opciones de `sort`. Para números, use `-n`, o `-h` para manipulación de números humanamente leíbles (Ej. desde `du -h`). Conozca el trabajo principal de (`-t` y `-k`). En particular, este atento que lo necesitará para escribir`-k1,1` para ordenar por solo el primer campo; `-k1` significa ordenar de acuerdo a toda la línea. Orden estable (`sort -s`) puede ser útil. Por ejemplo, para organizar el primer por el campo 2, entonces secundariamente hacerlo por el campo 1, Puedes usar `sort -k1,1 | sort -s -k2,2`.
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- Si necesitas siempre escribir un tab literal en una línea de comandos en Bash (Ej. para el argumento -t de ordenar), presione **ctrl-v** **[Tab]** o escriba `$'\t'` (El último es mejor porque puedes copiarlo/pegarlo).
2015-06-24 19:58:46 +02:00
2015-07-07 23:18:44 +02:00
- Las herramientas estándar para reparar el código fuente son `diff` y `patch`. Ver también `diffstat` para resumen estadístico de una diff. Nota `diff -r` trabaja con directorios por completo. Usar`diff -r tree1 tree2 | diffstat` para el resumen de cambios.
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- Para archivos binarios, usar `hd` para sencillos "hex dumps" y `bvi` para edición de binario.
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- También para archivos binarios, `strings` (además de `grep`, etc.) permite encontrar en el texto bits.
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- Para diffs binaria (delta compression), usar `xdelta3`.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Para convertir la codificación del texto, probar `iconv`. O `uconv` para el uso avanzado; este soporta este soporta algunos elementos Unicode avanzados. Por ejemplo, este coloca en minúsculas y remueve todos los acentos (por expanción y colocándolos a ellos):
2015-06-24 19:58:46 +02:00
```sh
uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt
```
2015-07-17 19:02:42 +02:00
- Para dividir archivos en múltiples partes, consultar `split` (para dividir por tamaño) y `csplit` (para dividir por un patrón).
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- Usar `zless`, `zmore`, `zcat`, y `zgrep` para operar sobre archivos comprimidos.
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
## Depuración del sistema
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- Para depuración web, `curl` y `curl -I` son prácticos, o sus equivalentes `wget`, o el más moderno [`httpie`](https://github.com/jakubroztocil/httpie).
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Para el estado del disco/cpu/red, usar `iostat`, `netstat`, `top` (o el mejor `htop`), y (especialmente) `dstat`. Bueno para recibir una idea rápida de lo que está pasando en tu sistema.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Para una resumen en mayor profundidad, usar [`glances`](https://github.com/nicolargo/glances). Este se presenta con varios niveles de estadística en un solo terminal. Muy útil para una verificación rápida de varios subsistemas.
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- Para conocer el estado de la memoria, ejecutar y entender la salida de `free` y `vmstat`. En particular, tener en cuenta el valor "cached" es memoria mantenida por el kernel Linux como un archivo de cache, entonces efectivamente cuenta como valor para "free".
2015-06-24 19:58:46 +02:00
2015-07-14 18:21:12 +02:00
- El sistema de depuración de Java es harina de otro costal, pero un truco simple en las JSM de Oracle y de otros consta en que puedes ejecutar `kill -3 <pid>` y una traza completa y un resumen del montículo "heap summary" (incluyendo del detalle de la colección de basura generacional, la cual puede ser altamente informativa) serán descargados al stderr/logs. Las herramientas `jps`, `jstat`, `jstack`, `jmap` del JDK son útiles. [SJK tools](https://github.com/aragozin/jvm-tools) son más avanzadas.
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- Usar `mtr` como un mejor traceroute, para identificar los problemas en la red.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Para mirara porque el disco está lleno, `ncdu` ahorra tiempo sobre los comandos usual como `du -sh *`.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Para encontrar cual socket o proceso está utilizando el ancho de banda, prueba `iftop` o `nethogs`.
2015-06-24 19:58:46 +02:00
2015-07-07 23:18:44 +02:00
- La herramienta `ab` (viene con Apache) es útil para una verificación rápida y sucia del rendimiento del servidor web. Para pruebas de carga más complejas, prueba `siege`.
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- Para depuración de redes más serias, `wireshark`, `tshark`, o `ngrep`.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Conozca acerca `strace` y `ltrace`. Estas son de utilidad si un programa está fallando, guindando, o estrellando, y no conoces por qué?, o si quieres tener una idea general del rendimiento. Note la opción de elaboración de perfiles (`-c`), y la habilidad de adjuntar a un proceso en ejecución (`-p`).
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- Conozca acerca `ldd` para verificar librerías compartidas etc.
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- Conozca como conectarse a un proceso en ejecución con `gdb` y obtener su traza de pilas.
2015-06-24 19:58:46 +02:00
2015-07-07 23:18:44 +02:00
- Usar `/proc`. Este es extraordinariamente útil algunas veces cuando hay problemas de depuración en vivo. Ejemplos: `/proc/cpuinfo`, `/proc/xxx/cwd`, `/proc/xxx/exe`, `/proc/xxx/fd/`, `/proc/xxx/smaps`.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Cuando se depura porque algo salió más en el pasado, `sar` puede ser muy útil. Este muestra la estadística histórica en CPU, memoria, red, etc.
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- Para sistemas y análisis de rendimiento de mayor profundidad, ver `stap` ([SystemTap](https://sourceware.org/systemtap/wiki)), [`perf`](http://en.wikipedia.org/wiki/Perf_(Linux)), y [`sysdig`](https://github.com/draios/sysdig).
2015-06-24 19:58:46 +02:00
2015-07-03 20:52:22 +02:00
- Confirmar que OS te encuentras con `uname` o `uname -a` (información general Unix/kernel) o `lsb_release -a` (Linux distro info).
2015-06-24 19:58:46 +02:00
2015-07-07 23:18:44 +02:00
- Usar `dmesg` siempre que algo actúe raro (esto podría ser problemas con el hardware o driver).
2015-06-24 19:58:46 +02:00
## One-liners
2015-07-03 18:45:43 +02:00
Algunos ejemplos de comandos reunidos:
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Este es notablemente útil en ocasiones que hay que realizar intersección, unión, y diferencia de archivos de texto vía `sort`/`uniq`. Considere `a` y `b` como archivos de texto que son únicos. Esto es rápido, y trabaja con archivos de tamaño arbitrario, hasta varios gigabytes. (Sort no está limitado por la memoria, aunque quizás necesites utilizar la opción `-T` si `/tmp` está en una pequeña partición raíz.) Ver también la nota acerca `LC_ALL` y las opciones de `sort`, `-u` (dejado de lado para clarificar más abajo).
2015-06-24 19:58:46 +02:00
```sh
cat a b | sort | uniq > c # c is a union b
cat a b | sort | uniq -d > c # c is a intersect b
cat a b b | sort | uniq -u > c # c is set difference a - b
```
2015-07-17 19:02:42 +02:00
- Usar `grep . *` para visualmente examinar todo el contenido de todos los archivos de un directorio, Ej. para directorios llenos con parámetros de configuración, como `/sys`, `/proc`, `/etc`.
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- Sumar todos los números en la tercera columna de un archivo de texto (esto es probablemente 3X más rápido 3X menor código que el equivalente en Python):
2015-06-24 19:58:46 +02:00
```sh
awk '{ x += $3 } END { print x }' myfile
```
2015-07-17 19:02:42 +02:00
- Si quiere ver tamaños/fechas en un árbol de archivos, esto es como hacer recursivo `ls -l` pero es más fácil de leer que `ls -lR`:
2015-06-24 19:58:46 +02:00
```sh
find . -type f -ls
```
2015-07-17 19:02:42 +02:00
- Digamos que tiene un archivo de texto, como un log de un servidor web, y un cierto valor comienza a aparecer en algunas líneas, tales como un parámetro `acct_id` que está presente en el URL. Si quieres un recuento de cuantas peticiones ""request hay por cada `acct_id`:
2015-06-24 19:58:46 +02:00
```sh
cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn
```
2015-07-07 22:53:25 +02:00
- Ejecuta esta función para obtener un consejo aleatorio desde este documento (analiza el Markdown y extrae un elemento):
2015-06-24 19:58:46 +02:00
```sh
function taocl() {
curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md |
pandoc -f markdown -t html |
xmlstarlet fo --html --dropdtd |
xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" |
xmlstarlet unesc | fmt -80
}
```
2015-07-07 20:47:36 +02:00
## Oscuro pero útil
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- `expr`: ejecuta operaciones aritméticas o booleanas o evalúa expresiones regulares
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- `m4`: procesador de macro sencillo
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `yes`: imprime un string sin fin
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `cal`: lindo calendario
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `env`: ejecuta un comando (útil en scripts)
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `printenv`: imprime las variables del ambiente (útil en depuración y scripts)
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- `look`: buscar palabras en inglés (o líneas en un archivo) comenzando con un string
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `cut`, `paste` y `join`: manipulación de datos
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- `fmt`: formato de texto de párrafo
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `pr`: formato de texto en páginas/columnas
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `fold`: envolturas de líneas de texto
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `column`: formato de texto en columnas o tablas
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- `expand` y `unexpand`: convertidor entre tabuladores y espacios
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `nl`: agrega números de línea
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `seq`: imprime números
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `bc`: calculadora
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `factor`: factorización de enteros
2015-06-24 19:58:46 +02:00
- [`gpg`](https://gnupg.org/): cifrado y firmas digitales
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- `toe`: tabla de información de términos
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- `nc`: depuración del entorno de red y transferencia de datos
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `socat`: socket relay y redireccionador de puerto tcp (similar a `netcat`)
2015-06-24 19:58:46 +02:00
- [`slurm`](https://github.com/mattthias/slurm): visualización del tráfico de red
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `dd`: moviliza data entre archivos y dispositivos
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- `file`: identifica el tipo de archivo
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `tree`: muestra directorios y subdirectorios como un árbol anidado; parecido a `ls` pero recursivo
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `stat`: información del archivo
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `tac`: imprime archivos en forma inversa
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- `shuf`: selección de líneas de un archivo de forma aleatoria
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `comm`: compara archivos ordenados línea por línea
2015-06-24 19:58:46 +02:00
2015-07-03 20:52:22 +02:00
- `pv`: monitor del progreso de datos, a través, de un tubo
2015-07-03 18:45:43 +02:00
- `hd` y `bvi`: descarga o edita archivos binarios
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `strings`: extrae textos de archivos binarios
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- `tr`: traducción y manipulación de caracteres
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `iconv` o `uconv`: conversión de codificaciones de texto
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `split` y `csplit`: división de archivos
2015-06-24 19:58:46 +02:00
2015-07-07 22:53:25 +02:00
- `sponge`: lee todas las entradas antes de escribirlo, útil para vista previa y posterior escritura hacia el mismo archivo, Ej., `grep -v something some-file | sponge some-file`
2015-07-03 20:52:22 +02:00
2015-07-03 18:45:43 +02:00
- `units`: unidades de conversión y calculaciones; convierte furlongs por fortnight para twips por blink (ver también `/usr/share/units/definitions.units`)
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- `7z`: compresión de archivos de alto nivel
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- `ldd`: información de librería dinámica
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- `nm`: archivo de objeto de símbolos
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- `ab`: benchmarking de servidores web
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `strace`: depuración de llamadas del sistema
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- `mtr`: mejor traceroute para la depuración de la red
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `cssh`: shell concurrent visual
2015-06-24 19:58:46 +02:00
2015-07-15 20:47:35 +02:00
- `rsync`: sincronización de archivos y carpetas sobre SSH o en sistemas de archivos locales
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `wireshark` y `tshark`: captura de paquetes y depuración de la red
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `ngrep`: grep para la capa de la red
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `host` y `dig`: consulta DNS
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `lsof`: descriptor de archivo de procesos y información de socket
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- `dstat`: sistema de estadísticas útil
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- [`glances`](https://github.com/nicolargo/glances):vistazo de multi-subsistemas, de alto nivel
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `iostat`: estadísticas del CPU y uso del disco
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- `htop`: versión mejorada de top
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `last`: historial de login
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- `w`: quien está autenticado?
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `id`: información de identidad de usuario/grupo
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- `sar`: sistema de estadísticas histórico
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `iftop` o `nethogs`: utilización de la red por un socket o process
2015-06-24 19:58:46 +02:00
2015-07-07 20:47:36 +02:00
- `ss`: estadísticas de socket
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `dmesg`: arranque y sistema de mensajes de error
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `hdparm`: manipulación/rendimiento de discos SATA/ATA
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `lsb_release`: información de la distribución de Linux
2015-06-24 19:58:46 +02:00
- `lsblk`: lista de bloques de dispositivos: un árbol de vista de sus discos y particiones de disco
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
- `lshw`, `lscpu`, `lspci`, `lsusb`, `dmidecode`: información de hardware, incluyendo CPU, BIOS, RAID, gráficos, dispositivos, etc.
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- `fortune`, `ddate`, y `sl`: um, bien, este depende si tiene la consideración de locomotoras de vapor y citas Zippy "práctico"
2015-06-24 19:58:46 +02:00
2015-07-15 20:47:35 +02:00
## Solo para MacOS X
2015-07-03 20:52:22 +02:00
Estos son puntos relevantes *solo* en MacOS.
- Administración de paquetes con `brew` (Homebrew) y/o `port` (MacPorts). Estos pueden ser utilizados para instalar en MacOS muchos de los comandos de arriba.
- Copiar la salida de cualquier comando para una aplicación desktop con `pbcopy` y pegar desde una entrada con `pbpaste`.
2015-07-07 20:47:36 +02:00
- Para abrir un archivo con una aplicación desktop, usar `open` o `open -a /Applications/Whatever.app`.
2015-07-03 20:52:22 +02:00
- Spotlight: Busca archivos con `mdfind` y listar metadata (como información de foto EXIF) con `mdls`.
2015-07-17 19:02:42 +02:00
- Tenga en cuenta que MacOS está basado en BSD Unix, y cualquier comando (por ejemplo `ps`, `ls`, `tail`, `awk`, `sed`) tiene variaciones discretas variaciones por cada Linux, que está en gran parte influenciado por el sistema Unix V-style y herramientas GNU. Puedes frecuentemente decirme la diferencia por señalar unas páginas man que tienen el encabezado "BSD General Commands Manual." En algunos casos versiones GNU pueden ser instalados, también (tales como `gawk` y `gsed` para awk y sed del GNU). Si escribe cross-platform scripts Bash, evita tales comandos (por ejemplo, considerando Python o `perl`) o probar con mucho cuidado.
2015-07-03 20:52:22 +02:00
2015-07-03 18:45:43 +02:00
## Más recursos
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
- [awesome-shell](https://github.com/alebcay/awesome-shell): Una lista curada de herramientas shell y recursos.
- [Strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/) para escribir mejores script shell.
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
## Advertencia
2015-06-24 19:58:46 +02:00
2015-07-17 19:02:42 +02:00
Con excepción de pequeñas tareas, el código está escrito para que otros puedan leerlo. Con el poder llega la responsabilidad. El hecho de que tú *puedes* hacer algo en Bash no necesariamente significa que debas hacerlo! ;)
2015-06-24 19:58:46 +02:00
2015-07-03 18:45:43 +02:00
## Licencia
2015-06-24 19:58:46 +02:00
[![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/)
2015-06-24 19:58:46 +02:00
2015-07-03 20:52:22 +02:00
Este trabajo esta licenciado bajo [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/).