# Comandos Linux
Comandos Linux
# Comando screen
Screen es un programa muy útil que nos permite en una sola terminal de texto (consola, sesión telnet, etc.) tener hasta 10 ventanas (el equivalente a 10 terminales) haciendo diferentes tareas (shell en una, lector de correo o news en otra, etc.) y pudiendo cambiar entre ellas de una manera rápida y sencilla.
Screen suele venir en todas las distribuciones Linux. Una vez instalada la ejecutamos (screen) y ya podremos empezar a utilizarla.
Para usar SCREEN se usa el atajo de teclado ^A (Control-A). Cuando estemos en consola y queramos enviar una orden a screen (cambiar de "ventana", crear nuevas ventanas, etc.) se pulsa CTRL+A y a continuación la tecla del comando a enviar (soltando CTRL-A antes de pulsar la tecla de comando):
Tecla | Comando |
---|
CTRL+a seguido de ? | Se obtiene una pequeña lista de comandos. |
CTRL+a seguido de c | Se crea una nueva ventana (la inicial es la 0, luego 1, 2…). |
CTRL+a seguido de un número 0-9 | Cambiamos la vista a la ventana especificada por el número. |
CTRL+a seguido de n | Ir a la siguiente (next) ventana. |
CTRL+a seguido de p | Ir a la siguiente (previous) ventana. |
CTRL+a seguido de w | Obtenemos una lista de ventanas disponibles. |
Con exit cerramos la terminal en la que estemos. Al salir de screen (si hacemos un exit en la ultima terminal disponible) aparecerá el mensaje \[screen is terminating\].
Por ejemplo, es posible hacer lo siguiente:
```
[user@maquina] screen
c -> Creamos terminal 1
[user@maquina] mutt -> Abrimos el mutt
c -> Creamos terminal 2
[user@maquina] slrn -n -> Abrimos el slrn
```
Ahora podemos cambiar entre cualquiera de los 3 programas (mutt, slrn y una shell bash) mediante CTRL-A seguido del número 0 (bash), 1 (mutt) y 2 (slrn) ya que las hemos creado en ese orden. Podemos salir de cualquiera de los tres programas y estar bajo una shell bash disponiendo áun de dicha terminal (hasta que hagamos exit).
Otros comandos SCREEN más avanzados son:
Tecla | Comando |
---|
CTRL+a seguido de k | Borrar la pantalla de la ventana actual |
CTRL+a seguido de Ctrl+x | Bloquear la pantalla (pedirá la password del usuario). |
CTRL+a seguido de :detach | Desvincular la pantalla de la sesión de screen. Podemos recuperarla luego con screen -r |
#### Notas
> Screen soporta cosas mucho más complejas, como dettach de procesos, dejarlos corriendo en background al cerrar los terminales, etc. Consultar el manual de screen para más florituras.
> Screen soporta copiado de pantallas, loggin, cut & paste, keybindings, bloqueado de consola (bloquea todas :), etc.
> como la A está cerca de la S, puede ser que al hacer CTRL+a le demos a CTRL+s (comando STOP en las terminales TTY). En caso de que esto ocurra basta darle a CTRL+Q para detener el stop.
# Comando sed
##### El comando SED
El comando sed SED (Stream EDitor) es un editor de flujos y ficheros de forma no interactiva. Permite modificar el contenido de las diferentes líneas de un fichero en base a una serie de comandos o un fichero de comandos (-f fichero\_comandos). El comando sed de Linux edita datos basado en las reglas que tú le proporciones, puedes utilizarlo de la siguiente forma
```shell
$sed options file
```
Sed recibe por stdin (o vía fichero) una serie de líneas para manipular, y aplica a cada una de ellas los comandos que le especifiquemos a todas ellas, a un rango de las mismas, o a las que cumplan alguna condición.
```shell
Sustituir apariciones de cadena1 por cadena2 en todo el fichero:
# sed 's/cadena1/cadena2/g' fichero > fichero2
Sustituir apariciones de cadena1 por cadena2 en las líneas 1 a 10:
# comando | sed '1,10 s/cadena1/cadena2/g'
Eliminar las líneas 2 a 7 del fichero
# sed '2,7 d' fichero > fichero2
Buscar un determinado patrón en un fichero:
# sed -e '/cadena/ !d' fichero
Buscar AAA o BBB o CCC en la misma línea:
# sed '/AAA/!d; /BBB/!d; /CCC/!d' fichero
Buscar AAA y BBB y CCC:
# sed '/AAA.*BBB.*CCC/!d' fichero
Buscar AAA o BBB o CCC (en diferentes líneas, o grep -E):
# sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
# gsed '/AAA\|BBB\|CCC/!d'
```
##### Formato de uso
El formato básico de uso de sed es:
```shell
# sed [-ns] '[direccion] instruccion argumentos'
```
Donde:
- \[direccion\] es opcional, siendo un número de línea (N), rango de números de línea (N,M) o búsqueda de regexp (/cadena/) indicando el ámbito de actuación de las instrucciones. Si no se especifica \[direccion\], se actúa sobre todas las líneas del flujo.
- Instruccion puede ser:
- i = Insertar línea antes de la línea actual.
- a = Insertar línea después de la línea actual.
- c = Cambiar línea actual.
- d = Borrar línea actual.
- p = Imprimir línea actual en stdout.
- s = Sustituir cadena en línea actual.
- r fichero = Añadir contenido de "fichero" a la línea actual.
- w fichero = Escribir salida a un fichero.
- ! = Aplicar instrucción a las líneas no seleccionadas por la condición.
- q = Finalizar procesamiento del fichero.
- -n: No mostrar por stdout las líneas que están siendo procesadas.
- -s: Tratar todos los ficheros entrantes como flujos separados.
##### Ejemplos de sustitución
```shell
Reemplazar cadenas:
# sed 's/^Host solaris8/Host solaris9/g' fichero > fichero2
Reemplazar cadenas sólo en las lineas que contentan una cadena:
# sed '/cadena_a_buscar/ s/vieja/nueva/g' fichero > fichero2
Reemplazar cadenas sólo en en determinadas líneas:
# sed '5,6 s/vieja/nueva/g' fichero > fichero2
Reemplazar multiples cadenas (A o B):
# sed 's/cadenasrc1\|cadenasrc2/cadena_nueva/g'
Sustituir líneas completas (c) que cumplan o no un patrón:
# echo -e "linea 1\nlinea 2" | sed '/1/ cPrueba'
Prueba
linea 2
# echo -e "linea X 1\nlinea 2" | sed '/1/ !cPrueba'
linea 1
Prueba
```
##### Ejemplos de Inserción
```shell
Insertar 3 espacios en blanco al principio de cada línea:
# sed 's/^/ /' fichero
Añadir una línea antes o despues del final de un fichero ($=última línea):
# sed -e '$i Prueba' fichero > fichero2
# sed -e '$a Prueba' fichero > fichero2
Insertar una linea en blanco antes de cada linea que cumpla una regex:
# sed '/cadena/{x;p;x;}' fichero
Insertar una linea en blanco detras de cada linea que cumpla una regex:
# sed '/cadena/G' fichero
Insertar una linea en blanco antes y despues de cada linea que cumpla una regex:
# sed '/cadena/{x;p;x;G;}' fichero
Insertar una línea en blanco cada 5 líneas:
# sed 'n;n;n;n;G;' fichero
Insertar número de línea antes de cada línea:
# sed = filename | sed 'N;s/\n/\t/' fichero
Insertar número de línea, pero sólo si no está en blanco:
# sed '/./=' fichero | sed '/./N; s/\n/ /'
Si una línea acaba en \ (backslash) unirla con la siguiente:
# sed -e :a -e '/\\$/N; s/\\\n//; ta' fichero
```
##### Ejemplos de Selección/Visualización
```shell
Ver las primeras 10 líneas de un fichero:
# sed 10q
Ver las últimas 10 líneas de un fichero:
# sed -e :a -e '$q;N;11,$D;ba'
Ver un rango concreto de líneas de un fichero:
# cat -n fich2 | sed -n '2,3 p'
2 linea 2
3 linea 3
(Con cat -n, el comando cat agrega el número de línea).
(Con sed -n, no se imprime nada por pantalla, salvo 2,3p).
Ver un rango concreto de líneas de varios ficheros:
# sed '2,3 p' *
linea 2 fichero 1
linea 3 fichero 1
linea 2 fichero 2
linea 3 fichero 2
(-s = no tratar como flujo sino como ficheros separados)
Sólo mostrar la primera linea de un fichero:
# sed -n '1p' fichero > fichero2.txt
No mostrar la primera linea de un fichero:
# sed '1d' fichero > fichero2.txt
Mostrar la primera/ultima línea de un fichero:
# sed -n '1p' fichero
# sed -n '$p' fichero
Imprimir las líneas que no hagan match con una regexp (grep -v):
# sed '/regexp/!d' fichero
# sed -n '/regexp/p' fichero
Mostrar la línea que sigue inmediatamente a una regexp:
# sed -n '/regexp/{n;p;}' fichero
Mostrar desde una expresión regular hasta el final de fichero:
# sed -n '/regexp/,$p' fichero
Imprimir líneas de 60 caracteres o más:
# sed -n '/^.\{60\}/p' fichero
Imprimir líneas de 60 caracteres o menos:
# sed -n '/^.\{65\}/!p' fichero
# sed '/^.\{65\}/d' fichero
```
##### Ejemplos de Borrado
```shell
Eliminar un rango concreto de líneas de un fichero:
# sed '2,4 d' fichero > fichero2.txt
Eliminar todas las líneas de un fichero excepto un rango:
# sed '2,4 !d' fichero > fichero2.txt
Eliminar la última línea de un fichero
# sed '$d' fichero
Eliminar desde una línea concreta hasta el final del fichero:
# sed '2,$d' fichero > fichero2.txt
Eliminar las líneas que contentan una cadena:
# sed '/cadena/ d' fichero > fichero2.txt
# sed '/^cadena/ d' fichero > fichero2.txt
# sed '/^cadena$/ d' fichero > fichero2.txt
Eliminar líneas en blanco (variación del anterior):
# comando | sed '/^$/ d'
# sed '/^$/d' fichero > fichero2.txt
Eliminar múltiples líneas en blanco consecutivas dejando sólo 1:
# sed '/./,/^$/!d' fichero
Añadir una línea después de cada línea:
# echo -e "linea 1\nlinea 2" | sed 'aPrueba'
linea 1
Prueba
linea 2
Prueba
Eliminar espacios al principio de línea:
# sed 's/^ *//g' fichero
Eliminar todos los espacios que haya al final de cada línea:
# sed 's/ *$//' fichero
Eliminar espacios sobrantes a principio y final de línea, o ambos:
# sed 's/^[ \t]*//' fichero
# sed 's/[ \t]*$//' fichero
# sed 's/^[ \t]*//;s/[ \t]*$//' fichero
Eliminar tags HTML:
# sed -e :a -e 's/<[^>]*>//g;/ fichero2.txt
```
##### Uso de salida selectiva
```shell
Salir a nuestra voluntad antes de acabar el fichero:
# sed -e '/uno/ s/uno/1/' -e '/salir/ q' fichero > fichero2.txt
# sed 10q fichero
# sed q fichero
Equivalencia de -e con ";":
# sed -e '/AAA/b' -e '/BBB/b' -e 'd' == sed '/AAA/b;/BBB/b;d'
Usar 'q' apropiadamente reduce tiempo de procesamiento:
# sed -n '10,20p' fichero
# sed -n '21q;10,20p' fichero -> Más rápido que el anterior.
Conversión de CRLF de DOS a formato UNIX (LF):
# sed 's/.$//' fichero
Conversión de LF de UNIX a formato DOS (CRLF):
# sed 's/$'"/`echo \\\r`/" fichero
Obtener el Subject de un correo, pero sin cadena "Subject: ":
# sed '/^Subject: */!d; s///;q' fichero
Imprimir párrafo (cadenas entre 2 líneas en blanco) si contiene XXX:
# sed -e '/./{H;$!d;}' -e 'x;/XXX/!d;' fichero
Imprimir párrafo si contiene (1) XXX y ZZZ o bien (2) XXX o ZZZ :
# sed -e '/./{H;$!d;}' -e 'x;/XXX/!d;/ZZZ/!d'
# sed -e '/./{H;$!d;}' -e 'x;/XXX/b' -e '/ZZZ/b' -e d
```
# Comando wc
El comando **wc** (word count) es un comando utilizado en Linux para realizar cuenta desde la línea de comando, permite contar palabras, caracteres, líneas.
##### Modo de uso
```shell
wc -l número de líneas
wc -c número de bytes
wc -m imprime el número de caracteres
wc -L imprime la longitud de la línea más larga
wc -w imprime el número de palabras
```
##### Ejemplo de uso
```shell
$ wc prueba1.txt prueba2.txt
40 149 947 prueba1.txt
2294 16638 97724 prueba2.txt
2334 16787 98671 total
```
##### Combinación con otros comandos
Concatenamos el contenido del archivo /var/log/maillog, con grep buscamos todas las líneas que contengan “usuario@dominio” en su contenido, y con wc -l contamos las líneas resultantes.
```shell
$ cat var/log/maillog | grep "usuario@dominio.com" | wc -l
40
```