DPD Comandos básicos

De Gleducar, http://www.gleducar.org.ar

(Redirigido desde Comandos básicos)

Yes check.svg Esta página fue revisada y cumple los estándares de Gleduwiki.

Contenido

Trabajo en la línea de comandos

Los estudiantes deberían poder interactuar con el bash shell y comandos desde una consola virtual.

Objetivos clave
Usar comandos simples y secuencias de comandos para ejecutar tareas básicas en una consola virtual.
Usar y modificar el entorno del shell, incluyendo definición, referencia y exportación de variables de entorno.
Usar y editar el comando history.
Invocar comandos dentro y fuera del path definido.
Usar comandos recursivos dentro de un arbol de directorios.
Archivos, términos y utilidades
. 
bash
echo
env
exec
export
pwd
set
unset
~/.bash_history
~/.profile

Comandos básicos

pwd

Descripción

Este comando nos devuelve la ruta completa sobre la cual estamo trabajando: PWD viene de Print Working Directory.

Su utilización es muy simple y en su forma básica no requiere de argumentos.

Ejemplos

Un pequeño ejemplo:

$ pwd
/home/yaco/gnu-informes

echo

Descripción

Este comando nos permite "imprimir" cosas en la pantalla (o cualquier otra interfaz de salida de datos). Esas cosas pueden ser cadenas de texto ingresadas por el teclado (o cualquier otra interfaz de entrada de datos) variables o incluso podremos efectuar operaciones aritméticas básicas.

El comando echo recibe las cadenas de texto entre comillas (simples o dobles), y saca por defecto a la pantalla lo que le pasamos como argumento; aunque puede enviar la salida a otros sitios, como podrás comprobar más adelante.

Ejemplos

Mostramos una cadena simple de texto:

usuario@maquina ~ $ echo "Hola, alumno de Gleducar"
Hola, alumno de Gleducar

Ahora probemos hacer algun cálculo sencillo:

usuario@maquina ~ $ echo $[5*3]
15

Como mencionamos antes, es posible usar echo para mostrar el valor contenido en una variable. Para hacer esto es necesario colocar un $ (signo de moneda) antes del nombre de la variable.

$ echo $PWD
/home/yaco/gnu-admin

Generalmente en la consola de Linux usamos lo que comunmente se conocen como Variables de entorno

env

Descripción

El comando env se utiliza para listar o mostrar las distintas variables de entorno definidas por el usuario con su respectivo valor.

Existen una serie de variables básicas que siempre estan presentes en la configuración del usuario, por eso es muy importante tener una noción acerca de la información que contienen:

  • EDITOR : Variable que almacena el editor que usará el usuario por defecto.
  • ENV : Variable que almacena el archivo en donde el usuario ha definido sus aliases y funciones.
  • HOME : Variable que almacena el directorio del usuario, desde el que arrancará la shell cuando entra en el sistema.
  • HOSTNAME : Variable que almacena el nombre de la máquina.
  • LOGNAME : Variable que almacena el nombre o login del usuario.
  • MAIL : Variable que almacena el archivo que contiene el correo de usuario.
  • MAILCHECK : Variable que indica cada cuantos segundos debe comprobarse si el usuario tiene correo.
  • PATH : Variable en la que se encuentran almacenados los paths de aquellos directorios a los que el usuario tiene acceso directo, pudiendo ejecutar comandos o programas ubicados en ellos sin necesidad de acceder a dicho directorio.
  • PS1 : Variable que almacena el prompt que se empleará por defecto en la shell.
  • PS2, PS3, etc. : Variable que almacena el prompt que se empleara en la 2ª, 3ª, etc. Subshells, lo cual se hace invocando a la shell,es decir, ejecutando por ejemplo, ksh.
  • PWD : Variable que almacena el directorio actual, puede ser útil para modificar el prompt (PS1) dinámicamente.
  • SHELL : Variable que almacena el interprete de comandos que usa el usuario.
  • TERM : Variable que almacena el tipo de terminal desde el que se está trabajando.
  • TMOUT : Variable que almacena el tiempo de inactividad que se permite al usuario antes de que el sistema le cierre la sesión.
Ejemplos

Veamos el ejemplo básico para la utilización de env:

$ env
HISTORY=100
HOME=/home/guadalajara/pancho
HZ=100
LOGNAME=pancho
MAIL=/var/mail/pancho
MANSECTS=\1:1m:1c:1f:1s:1b:2:\3:3c:3i:3n:3m:3k:3g:3e:3x11:3xt:3
w:3b:9:4:5:7:8
PATH=/usr/bin
SHELL=/bin/sh
TERM=sun
TZ=EST5EDT

set

Descripción

Este comando nos permite redefinir el valor de una variable de forma volátil

set es utilizado dentro de scripts shells como variables locales que sólo existen durante la ejecución del script, si quieres que tu variable alcance el nivel global, debes usar export

Ejemplos

Probemos asignar una variable con set desde nuestra consola de comandos (no dentro de un script):

$ set INFO="informacion"
$ echo $INFO

$

El nuevo valor de la variable no a sido asignado de forma estática. Por eso no da nada como salida.

Ahora usemos set sin ningún parámetro:

$ set
HISTORY=100
HOME=/home/guadalajara/pancho
HZ=100
LOGNAME=pancho
MAIL=/var/mail/pancho
MANSECTS=\1:1m:1c:1f:1s:1b:2:\3:3c:3i:3n:3m:3k:3g:3e:3x11:3xt:3
w:3b:9:4:5:7:8
PATH=/usr/bin
SHELL=/bin/sh
TERM=sun
TZ=EST5EDT

Nos muestra las variables y sus diferentes valores. Lo mismo que el comando env.

Con los conocimientos adquiridos hasta ahora, el comando set parece un tanto inservible o dispensable, pero comprenderemos su importancia cuando hagamos algunos scripts.

unset

Descripción

Este comando remueve una o varias variables.

Debemos tener en cuenta que unset no solo quita el valor de una variable sino que tambien elimina la variable.

Ejemplos

Un ejemplo sencillo en el cual removemos una variable. Nótese que no antecedemos el nombre de la misma con $ ya que no estamos haciendo referencia a su valor, sino a la variable en sí.

$ echo $VAR1
123
$ unset VAR1
$ echo $VAR1

$

export

Descripción

Este comando es utilizado para asignar un valor a una variable.

Hasta ahora sabemos como ver el contenido de una variable en particular (mediante echo) o del conjunto de variables de entorno del usuario (mediante env). Si la variable ya existia, usamos set para cambiarle el valor. Ahora usando el comando export podremos crear una nueva variable con un valor definido.

Ejemplos

Creamos una variable nueva y le damos un valor:

$ export VARIABLENUEVA=123
$ echo $VARIABLENUEVA
123

exec

Descripción

Este comando nos permite ejecutar un comando o acción en la consola.

A simple vista exec no presenta gran diferencia con el simple acto de escribir el nombre del comando o aplicación y ejecutarlo directamente. En sí, la diferencia radíca en que exec nos permite hacer subejecuciones de programas, todo dentro de un mismo hilo de proceso. Esto implica que exec hará mutar el proceso que le dió origen, tomando el control de la acción. Generalmente luego de ejecutar un exec la aplicación que lo generó se cerrará al finalizar el comando que libera el exec.

Este concepto puede parece complicado, pero será más comprensible cuando tratemos temas como Procesos (en esta misma unidad) y scripting.

Ejemplos

La mejor forma de entender el funcionamiento de exec es probandolo uno mismo (el ejemplo asume que estamos en una terminal en modo texto):

$ exec date
Tue Jul 17 17:25:05 PDT 2006

Arch Linux Gimmick 0.7.2 (vc/3)
GNU login:

En el ejemplo anterior se ejecuta el comando date, nos devuelve la fecha y hora actual; y luego, una vez concluido el proceso date, se cierra automaticamente la sesión del usuario.

Configuración básica

~/.bash_history

El historial de bash (history) es un archivo que almacena todo lo que fuimos haciendo en la linea de comandos, es decir guarda cada cosa que fuimos escribiendo, hasta los errores de tipeo que cometemos. Este archivo se encuentra en el directorio de cada usuario , el archivo en cuestion se llama .bash_history.

Podemos ver su contenido simplemente usando el comando cat:

$ cat /home/yaco/.bash_history
gparted
umount /dev/hda6
pacman -S ruby
pacman -S ruby-gtk2
pacman -S ruby-gtktrayicon
pacman -S ruby ruby-gtk2 ruby-gtktrayicon
pacman -S ca-certificates
mc -b
date

De todas formas, podemos sacarle más provecho al historial usando el comando history que nos permitirá reutilzar los comandos almacenados:

$ history
400 gparted
401 umount /dev/hda6
402 pacman -S ruby
403 pacman -S ruby-gtk2
404 pacman -S ruby-gtktrayicon
405 pacman -S ruby ruby-gtk2 ruby-gtktrayicon
406 pacman -S ca-certificates
407 mc -b
408 date

El número de la columna que acompaña a cada linea nos servira para reutilizar el comando. Si escribimos dicho número precedido por un ! (signo de exclamación) en la consola, dicho comando se ejecutará:

$ !408
Tue Jul 17 17:39:52 PDT 2006

~/.profile

Este fichero compone el esquema de archivos de configuración del profile (perfil) del usuario. Cuando BASH se inicia, lee y ejecuta órdenes desde el archivo /etc/profile (global para todos los usuarios), si existe. Después, busca ~/.bash_profile, ~/.bash_login, y ~/.profile, en este orden, y lee y ejecuta las órdenes desde el primero que existe y es legible.

En un archivo de profile generalmente encontramos la definición de muchas variables de entorno y tambien de ciertos alias. Esto varia segun la distribución.

Para ver el contenido del archivo .profile o .bash_profile de nuestro usuario ejecutamos:

$ cat .profile
. $HOME/.bashrc
export CVS_RSH=ssh
export MANPATH="/usr/man:/usr/X11R6/man"
export LESSCHARSET="latin1"
export INPUTRC="/etc/inputrc"
export LESS="-R"
export EDITOR="joe"
alias renzo='ssh 192.168.1.5'

Podemos facilmente editar el valor de nuestras variables al arranque simplemente editando este archivo.

Procesamiento de flujo de texto usando filtros

Los estudiantes deberían poder aplicar filtros a flujos de texto.

Objetivos clave
Enviar archivos de texto y flujos de salida, a través de utilidades de filtro, para modificar la salida, usando los comandos estándar de Unix que se encuentran en el paquete de utilidades de texto GNU.
Archivos, términos y utilidades
cat
cut
expand
fmt
head
hexdump
join
nl
paste
pr
sed
sort
split
tac
tail
tr
unexpand
uniq
wc

cat

Descripción

Este comando, como ya hemos comprobado, se utiliza para mostrar el contenido de uno o mas archivos.

Ejemplos

Ejecutamos cat para ver el contenido de un arhivo:

$ cat archivo1
Este es el contenido del archivo 1

Ahora ejecutamos cat para ver el contenido de varios archivos:

$ cat archivo1 archivo2 archivo3
Este es el contenido del archivo 1
Este es el contenido del archivo 2
Este es el contenido del archivo 3

cut

Descripción

Este comando permite cortar y filtrar una sección determinada de una cadena de texto basandose en un patrón único.

cut se usa para separar de cada linea de un archivo uno o mas campos, o una parte del archivo. Los campos se delimitan, por defecto, por espacio en blanco; pero se puede especificar el contenido.

Ejemplos

Supongamos que el archivo prueba tenga la siguiente apariencia:

1  blancos   250
2  negros 350
3  jacksons 125

Entonces al hacer

$ cut -f2 prueba

produce:

blancos
negros
jacksons

Es decir, separa el segundo campo ( -f2). Si en cambio hacemos:

$ cut -c1-6 prueba

esto separa las primneras seis columnas y por lo tanto produce:

1  bla
2  neg
3  jac

Como mencione antes, el delimitador de campos puede cambiar:

$cut -d: -f1,2 /etc/passwd
root:x
bin:x
daemon:x
mail:x
ftp:x
nobody:x
dbus:x
hal:x
avahi:x
bruno:x

Esto como se ve produce los dos primeros campos de /etc/passwd, los cuales (verifiquelo) estan separados por los dos puntos.

expand

Descripción

Este comando se usa para convertir las tabulaciones en un archivo a una cantidad de espacio determinada por el usuario.

Ejemplos

Teniendo el arhivo prueba, el cual contiene lo siguiente:

yaco    1       10
adrian  3       12
roman   8       20

Queremos convertir las tabulaciones en espacios de 25 cáracteres, entonces hacemos:

$ expand -t25 prueba
yaco                     1                        10
adrian                   3                        12
roman                    8                        20

fmt

Descripción

Este comando reformatea cada párrafo en el (los) archivo(s) especificado(s).

fmt siempre es acompañado de algún parámetro, los mas comunes suelen ser:

  • -w anchura
Especifica la anchura de la línea a rellenar
  • -c
Conserva la indentación de las primeras dos líneas
  • -s
Evita que las líneas cortas se junten en la salida.
Ejemplos

Partiendo del archivo prueba que contiene lo siguiente:

Hola a todos yo soy el leon.
Rugio la bestia en medio de la avenida.
Todos huyeron sin entender, panic show a plena luz del dia.

Probamos aplicar primero el fmt sin parámetros:

$ fmt prueba
Hola a todos yo soy el leon.  Rugio la bestia en medio de la avenida.
Todos huyeron sin entender, panic show a plena luz del dia.

Ahora especificamos la anchura:

$ fmt -w 30 prueba 
Hola a todos yo soy el leon.
Rugio la bestia en medio de
la avenida.  Todos huyeron
sin entender, panic show a
plena luz del dia.

Ahora le agregamos -s para evitar que las lineas cortas queden juntas:

$ fmt -sw 30 prueba
Hola a todos yo soy el leon.
Rugio la bestia en medio de
la avenida.
Todos huyeron sin entender,
panic show a plena luz
del dia.

head

Descripción

Este comando nos muestra las primeras 10 líneas (cabecera) de un archivo.

Es posible tambien especificar la cantidad de líneas a mostrar e incluso mostrar bytes en vez de lineas usando parámetros:

  • -n número
Proporciona el número de líneas a visualizar (por omisión son 10)
  • -c número
Muestra los primeros números bytes
Ejemplos

Teniendo el archivo prueba que contiene el siguiente texto (fragmento de una joya de Poe):

¡Ah, recuerdo tan claramente aquel desolado diciembre!
Cada chispa resplandeciente dejaba un rastro espectral.
Yo esperaba ansioso el alba, pues no había hallado calma en mis libros,
ni consuelo a la pérdida abismal
de aquella a quien los ángeles Leonor podrán llamar
y aquí nadie nombrará.

Queremos mostrar solo las 2 primeras líneas, enteonces ejecutamos:

$ head -n 2 prueba
¡Ah, recuerdo tan claramente aquel desolado diciembre!
Cada chispa resplandeciente dejaba un rastro espectral. 

Si en cambio queremos incluir todo el documento excepto una cantidad n de lineas (empezando por abajo) agregamos un signo - (menos) antecediendo al número de líneas:

$ head -n -3 prueba
¡Ah, recuerdo tan claramente aquel desolado diciembre!
Cada chispa resplandeciente dejaba un rastro espectral.
Yo esperaba ansioso el alba, pues no había hallado calma en mis libros,

hexdump

Descripción

Este comando muestra un fichero en un formato especificado por el usuario (ASCII, decimal, hexadecimal, octal). Por defecto se muestra en formato hexadecimal.

Ejemplos

Si intentamos visualizar un archivo binario con el comando cat, por ejemplo, obtendremos algo ilegible e inútil:

$ cat /bin/ls
Æÿÿé=ÿÿÿ$¶ÀD$è÷Åÿÿéòüÿÿ$¹,L$èáÅÿÿé�?üÿÿ$»
\$èËÅÿÿéfüÿÿ¶UåSìÛtBÇ$¸D¸8D$è$ÆÿÿD$¡T$èéÅÿÿ$èñÈÿÿÇ$¸D¸`D$èâÅÿÿ$T$è�?ÇÿÿÇ$¹¸
L$Dè²Åÿÿ$T$è`ÅÿÿÇ$ºTD$èÅÿÿ$T$è0ÅÿÿÇ$¸D¸TD$èRÅÿÿ$T$èÅÿÿÇ$¸D¸XD$è"Åÿÿ$T$è�?ÄÿÿÇ$¹ä¸
L$DèòÄÿÿ$T$è ÄÿÿÇ$º¸TD$èÂÄÿÿ$T$èpÄÿÿÇ$¸D¸ðD$èÄÿÿ$T$è@ÄÿÿÇ$¸D¸$D$èbÄÿÿ$T$èÄÿÿÇ$¹

En cambio, al usar hexdump obtenemos la información en hexadecimal del binario:

$ hexdump /bin/ls
000cd80 f089 75f7 d3f4 f065 d689 c789 458b f7e4
000cd90 39e7 89f2 77c1 0f13 c094 d231 4d3b 0ff0
000cda0 c297 d085 840f ff17 ffff e94f ff11 ffff
000cdb0 8955 8de5 f04d 5657 ec83 8b38 1045 45c7
000cdc0 00e0 0000 8b00 1455 45c7 00e4 0000 8900

join

Descripción

Este comando nos permite comparar dos o más archivos y encontrar sus lineas con carácteres coincidentes.

Ejemplos

Tenemos dos archivos de prueba. El primero, prueba-1 contiene:

Del mar hacia las calles corre la vaga niebla
como el vapor de un buey enterrado en el frío,
y largas lenguas de agua se acumulan cubriendo
el mes que a nuestras vidas prometió ser celeste. 

El archivo prueba-2 contiene:

Pasan huyendo los pájaros.
El viento. El viento.
Yo sólo puedo luchar contra la fuerza de los hombres.
El temporal arremolina hojas oscuras
y suelta todas las barcas que anoche amarraron al cielo.

Ahora comparamos ambos archivos con join:

$ join prueba-1 prueba-2
y suelta todas las barcas que anoche amarraron al cielo. 
largas lenguas de agua se acumulan cubriendo

nl

Descripción

Este comando permite numerar las líneas de nuestro documento.

Ejemplos

El uso de nl es realmente simple. Partiendo de un archivo prueba de ejemplo con un par de líneas:

La noche que rompe la copa, vendiendo ilusiones
dejándote retazos de sueños por los rincones
"pero, nena, tu risa es la magia de los rocanrroles
tatuada llevo la marca de tus aguijones".

Obtenemos mediante nl la numeración de sus líneas:

$ nl prueba
1   La noche que rompe la copa, vendiendo ilusiones
2   dejándote retazos de sueños por los rincones
3   "pero, nena, tu risa es la magia de los rocanrroles
4   tatuada llevo la marca de tus aguijones". 

Podemos obtener el mismo resultando usanto cat -n en vez de nl.

paste

Descripción

Este comando nos permite unir el contenido de dos documentos de forma inteligente.

Ejemplos

Tenemos dos archivos con columnas, prueba-1 y prueba-2, el primero contiene:

10 20
50 40
70 80
05 10

Y en prueba-2:

15 20
60 70 
40 30

Al usar paste podemos pegarlos manteniendo el formato de las columnas:

$ paste prueba-1 prueba-2

10 20   15 20
50 40   60 70
70 80   40 30
05 10

pr

Descripción

Este comando convierte un archivo y le asigna un formato para que sea imprimible. Permite añadilr cabeceras y pies de página, formatearlo con columnas, cambiarle el espaciado, etc.

Algunas opciones:

  • pr --columnes=n <archivo>
Formatea el texto con n cantidad de columnas.
  • pr -t <archivo>
Suprime las 5 líneas del encabezamiento y las del final de página.
  • pr -wn <archivo>
Ajusta la anchura de la línea a n posiciones.
  • pr -d <archivo>
Lista el fichero con espaciado doble.
Ejemplos

Al usar pr sin argumentos adicionales, se produce una salida estándar de 66 líneas por página, con un encabezamiento de 5 líneas (2 en blanco, una de identificación y otras 2 líneas en blanco). El encabezado se ve así:

2006-07-19 06:38                      trigo                       Page 1

El trigo (Triticum spp) es el término que designa al conjunto de cereales tanto cultivados
como silvestres pertenecientes al género Triticum, que son plantas anuales de la familia de 
las   gramíneas, ampliamente cultivadas en todo el mundo.

sed

Descripción

Este comando es un editor estilo "batch" que aplica unos subcomandos a todas las lineas de un archivo. Esto implica que para usar a sed, hay que aprenderse estos subcomandos. Lamentablemente, el manual correspondiente es casi indescifrable. Afortunadamente, los comandos se parecen a los de vi (lo veremos al final del módulo).

Este comando tiene su mayor utilidad en shell scripts. Lo veremos en detalle en otra leccion.

Ejemplos

Algunos ejemplos para tener una noción mínima de la capacidad de sed:

$ sed '500,600pq' prueba

Con esto filtramos las lineas de prueba entre las numero 500 y la 600 (esto es print o p) y luego sed termina debido al q (quit). Esto se puede utilizar para seleccionar grupos de lineas de un archivo.

Otro ejemplo, un "buscar y reemplazar" en una línea:

$ sed 's/patron1/patron2/g' arch1

Cambia todas las ocurrencias de "patron1" en arch1 por "patron2".

sort

Descripción

Este comando nos permite ordenar las lineas de un archivo. Las lineas (registros o records en la terminologia de sort) se pueden subdividir en campos; el ordenamiento puede ser alfabetico o numerico y el orden ascendiente o descendiente.

Ejemplos

En este primer ejemplo aplicamos el orden alfabético descendente en el archivo prueba-1 que contiene originalmente:

vaca
casa
perro

Aplicamos ahora sort:

$ sort prueba-1
casa
perro
vaca

Aplicamos el orden numérico agregando el parámetro -n. Tambien es posible inveritr la salida usando -r (aplicariamos un ascendente en el ejemplo anterior)

split

Descripción

Este comando permite dividir un arhivo en otros de una x cantidad de bytes.

Ejemplos

Dividimos el archivo prueba en partes de 100000 bytes:

$ split -b 100000 prueba

las partes quedarán en archivos con nombres como xaa, xab, etc..

tac

Descripción

Este comando funciona de la misma forma que cat, solo que su salida es invertida.

Ejemplos

El srchivo pueba contiene el estribillo del "himno GNU":

I'm a gnu—I'm a gnu
The g-nicest work of g-nature in the zoo
I'm a gnu—how do you do?
You really oughtta g-know w-who's w-who
I'm a gnu—spelt G - N - U
I'm not a camel or a kangaroo
So let me introduce, I'm neither man nor moose
Oh, g-no, g-no, g-no, I'm a gnu!" 

Al usar tac invertimos el texto:

$ tac prueba
Oh, g-no, g-no, g-no, I'm a gnu!"
So let me introduce, I'm neither man nor moose
I'm not a camel or a kangaroo
I'm a gnu-spelt G - N - U
You really oughtta g-know w-who's w-who
I'm a gnu-how do you do?
The g-nicest work of g-nature in the zoo
I'm a gnu-I'm a gnu

tail

Descripción

Este comando funciona de forma muy similar a head, solo que muestra las 10 últimas lineas del archivo.

Al igual que head, podemos usar los siguientes parámetros:

  • -n número
Proporciona el número de líneas a visualizar (por omisión son 10)
  • -c número
Muestra los últimos números bytes
Ejemplos

El archivo de prueba contiene:

Sintió sobre el vientre un leve picor, con la espalda se deslizó lentamente más cerca de la  
cabecera de la cama para poder levantar mejor la cabeza; se encontró con que la parte que le 
picaba estaba totalmente cubierta por unos pequeños puntos blancos, que no sabía a qué se 
debían, y quiso palpar esa parte con una pata, pero inmediatamente la retiró, porque el roce e 
producía escalofríos.

Usamos tail para ver sus últimas 2 líneas:

$ tail -n 2 prueba
debían, y quiso palpar esa parte con una pata, pero inmediatamente la retiró, porque el roce e  
producía escalofríos.

tr

Descripción

Este comando permite intercambiar carácteres en un archivo de texto.

Ejemplos

El archivo prueba-1 contiene:

más adelante, Hamlet sintió que su madre había sido una mala mujer, además de que la sombra de 
su padre le ha aparecido y dicho la manera en que fue asesinado

Ahora usando tr cambiamos de minúculas a mayúsculas el contenido de prueba-1:

$ tr 'A-Z' 'a-z' < fichero.txt
M�?S ADELANTE, HAMLET SINTIÓ QUE SU MADRE HAB�?A SIDO UNA MALA MUJER, ADEM�?S DE QUE LA SOMBRA DE  
SU PADRE LE HA APARECIDO Y DICHO LA MANERA EN QUE FUE ASESINADO

unexpand

Descripción

Este comando convierte un número fijo de espacios (por defecto 8) de un archivo en un tabulador.

Usando el comando expand obtenemos el resultado inverso.

Ejemplos

El archivo de prueba contiene:

1 2 3 4 5

Usamos unexpand:

$ unexpand prueba
1       2       3       4       5

uniq

Descripción

Este comando elimina lineas repetidas adyacentes en un archivo entrada, permitiendo direccionar el resultado a un archivo de salida.

Algunas opciones del comando:

  • -u
copia en la salida solamente las lineas que no esten repetidas
  • -d
solo escribra en la salida una copia de cada linea repetida
  • -n
se saltara los n primeros campos
  • +n
los n primeros caracteres seran ignorados
Ejemplos

El archivo de prueba contiene:

2
5
8
10
5
8

Si usamos uniq de la siguiente forma por ejemplo:

$ uniq -d prueba
8
5

wc

Descripción

Este comando cuenta la cantidad de palabras, líneas y caracteres en uno o más archivos. Por defecto presenta los tres datos por cada archivo que reciba y después presenta las sumas.

Con alguna de las siguientes opciones presenta:

  • -c
la cuenta de caracteres
  • -l
la cuenta de líneas
  • -w
la cuenta de palabras
  • -L
la longitud de la línea más larga.
Ejemplos

El archivo prueba contiene el siguient texto:

La República Argentina es el segundo estado más extenso de América del Sur y el octavo en 
extensión de todo el planeta.

Obtendremos la cantidad de palabras del mismo:

$ wc -w prueba
22 prueba

Administración básica de archivos

Los estudiantes deberían poder usar los comandos básicos de Linux para administrar archivos y directorios.

Objetivos clave
Copiar, mover y remover archivos y directorios individualmente.
Copiar múltiples archivos y directorios recursivamente.
Remover archivos y directorios recursivamente.
Uso simple y avanzado de comodines en los comandos.
Usar find para localizar y actuar sobre archivos basándose en el tipo, tamaño o fecha.
Archivos, términos y utilidades
cp
find 
mkdir 
mv 
ls 
rm 
rmdir 
touch 
file globbing

cp

Descripción

Este comando nos permite copiar archivos especificando su origen y destino.

Ejemplos

Copiamos un archivo a un nuevo directorio sin perder el original:

$ cp /home/imagenes_viejas/origen.png /home/imagenes/
$ ls /home/imagenes/
origen.png
$ ls /home/imagenes_viejas/
origen.png 

find

Descripción

Este comando nos permite buscar archivos que contengan un nombre, extensión o que cumplan cierta condición.

Ejemplos

Un ejemplo de busqueda por nombre/extensión:

$ find /mnt/musica -name *.mp3
/mnt/musica/John Lennon/Wonsaponatime/01 - I'm Losing You.mp3
/mnt/musica/John Lennon/Wonsaponatime/02 - Working Class Hero.mp3
/mnt/musica/John Lennon/Wonsaponatime/03 - God.mp3

mkdir

Descripción

Este comando permite crear carpetas.

Ejemplos

Creación simple de directorio:

$ ls ./
Gato   Perro   Vaca  
$ mkdir Buey
$ ls ./
Gato   Perro   Vaca  Buey 

mv

Descripción

Este comando nos permite mover archivos especificando su origen y destino.

Ejemplos

Movemos un archivo a un nuevo directorio:

$ cp /home/imagenes_viejas/origen.png /home/imagenes/
$ ls /home/imagenes/
origen.png
$ ls /home/imagenes_viejas/
$

ls

Descripción

Este comando lista los archivos y carpetas contenidos en una ruta determinada.

Ejemplos

Listamos todos los archivos y subcarpetas de una carpeta, incluso los/las ocultas:

$ ls -la /home/yaco
-rw-------   1 root  root      541 Jul 13 02:03 .gmnotify.conf
drwxr-xr-x   4 root  root     4096 Jul  4 01:45 .gnome
drwx------  15 root  root     4096 Jul  8 21:10 .gnome2
drwxr-xr-x   2 root  root     4096 Jun  2 14:04 Music
drwxr-xr-x   4 root  root     4096 May 31 16:56 OLPC
drwxr-xr-x  25 root  root     4096 Jul 13 02:26 Paquetes
drwxr-xr-x   5 root  root     4096 May 26 23:38 PicasaDocuments
-rw-r--r--   1 root  root     4854 May 10 17:48 LocalSettings.php
-rw-r--r--   1 root  root     4562 May  8 20:37 LocalSettings.php~

rm

Descripción

Este comando nos permite eliminar uno o más archivos. Tambien permite eliminar carpetas.

Ejemplos

Eliminamos un par de archivos con nombre común:

$ ls /home
Borrame1 Borrame2 Borrame3
$ rm Borrame*
$ ls /home
$

rmdir

Descripción

Este comando permite eliminar una carpeta. Como condición, esta carpeta deberá estar vacía.

Ejemplos

Borramos una carpeta:

$ ls /home
MiCarpeta1 MiCarpeta2
$ rmdir MiCarpeta1
$ ls /home
MiCarpeta2

touch

Descripción

Este comando sirve para crear archivos o actualizar la fecha de uno ya existente.

Ejemplos

Creamos un archivo vacio con touch:

$ ls /home
Archivo1  Archivo3
$ touch  Archivo2
$ ls /home
Archivo1 Archivo2 Archivo3 

file globbing

Descripción

El file globbing no es un comando, sino más bien una técnica. El "engoblamiento" tiene que ver con el uso de carácteres comodínes. Veamos esto un poco mas a fondo:

Cuando usted ingresa un comando como ls *.txt y presiona Intro, la tarea de encontrar cuales archivos se corresponden con el patrón *.txt no la realiza el comando ls, sino el shell en sí mismo. Esto requiere de una pequeña explicación sobre como interpreta el shell la línea de comandos. Cuando usted ingresa:

$ ls *.txt
$ leerme.txt recetas.txt
 

primero la línea de comandos se separa en palabras (ls y *.txt, en este ejemplo) . Cuando el shell ve un * en una palabra, interpretará toda la palabra como un patrón de englobamiento y la reemplazará con los nombres de todos los archivos que se correspondan con el patrón. Por lo tanto, justo antes que el shell la ejecute, la línea se convirtió en la línea ls leerme.txt recetas.txt, lo que da el resultado esperado. El shell reacciona así frente a otros caracteres como:

  • ? se corresponde con un único caracter (uno y sólo uno), cualquiera que sea este;
  • [...] se corresponde con cualquiera de los caracteres que se encuentran entre los corchetes; los caracteres pueden estar referidos por intervalos (por ejemplo, 1-9) o por valores discretos,o una mezcla de ambos. Ejemplo: [a-zBE5-7] se corresponderá con todos los caracteres desde la a hasta la z, una B, una E, un 5, un 6 o un 7;
  • [!...]: se corresponde con cualquier caracter que no se encuentre en los corchetes. [!a-z], por ejemplo, se corresponderá con cualquier caracter que no sea una letra minúscula[6];
  • {c1,c2} se corresponde con c1 o con c2, donde c1 y c2 también son patrones de englobamiento, lo cual significa que Usted puede escribir {[0-9]*,[acr]} por ejemplo.

Flujos, Tuberías y Redireccionamientos

Los estudiantes deberían poder redireccionar flujos y conectarlos para volver más eficientes los procesos con datos de texto. Las tareas incluyen redireccionamiento de entrada estándar, de salida estándar y de error estándar; entubar la salida de un comando a la entrada de otro usando la salida del primero como argumento del segundo y enviándo las salidas de ambos stdout a un archivo.

Objetivos clave
Redireccionado de la entrada estándar, salida estándar y error estándar.
Entubar la salida de un comando a la entrada de otro.
Usar la salida de un comando como argumento de otro comando.
Enviar la salida de ambos stdout a un archivo.
Archivos, términos y utilidades
tee 
xargs 
< 
<<
> 
>> 
| 
` ` (acento francés)

Tuberias

Podríamos representar cada programa como una caja negra que tiene una entrada y una salida que se pueden unir entre ellos.

Debido a que la entrada por defecto es el teclado y la salida por defecto
es terminal, graficaremos cuando sea necesario ambos.

El ejemplo que utilizamos se encuentra esquematizado en la figura

ESproceso.png

Siendo la entrada estándar el teclado y la salida estándar el terminal o por simplicidad la pantalla.

Vamos a suponer un caso ficticio donde necesitamos todas las definiciones de cada palabra en un texto. Primero las ordenamos alfabéticamente, luego utilizamos un comando ficticio llamado diccionario que toma palabras de la entrada estándar y las reescribe junto a su significado en la salida estándar.

Su esquema se ve en la figura

Tuberia.png

En este caso nombramos por separado las entradas y salidas estándares de los dos programas, pero la unión entre ambos programas se puede considerar como un sólo tubo.

En ese tubo, el flujo está en un estado intermedio, donde está ordenado, pero no tiene las definiciones de diccionario.

En la línea de comandos esto se escribe de la siguiente manera:

$ sort | dicccionario

Donde el caracter " | " representa la conexión entre la salida estándar de un programa y la entrada estándar de otro.

Con este fuerte y simple concepto se pueden concatenar gran cantidad de programas como si fuera una línea de producción en serie para generar resultados complejos.

Para mejorar nuestro ejemplo sacaremos las palabras repetidas, antes de mostrarlas con definiciones. Suponiendo que exista un programa llamado sacar-repetidas, la línea de comando sería:

$ sort | sacar-repetidas | diccionario

Simple, utilizando herramientas sencillas logramos algo un poco más complicado. El inconveniente que tenemos en este ejemplo es que hay que escribir aquello a procesar. Normalmente queremos utilizar archivos como entrada de nuestros datos.

Es necesario un comando que envíe a la salida estándar un archivo, así se procesa como la entrada estándar del sort y continúa el proceso normalmente. Este comando es cat. La sintaxis es simple

cat nombre-de-archivo

Quedando nuestro ejemplo:

$ cat archivo.txt | sort | sacar-repetidas | diccionario

... esto crea un glosario de las palabras que se encuentren en archivo.txt

La combinación de comandos es incalculable y brinda posibilidades enormes. Veamos algunos ejemplos.

En el caso que se quieran buscar procesos con el string http:

$ ps ax | grep http
3343 ?        S      0:00 httpd -DPERLPROXIED -DHAV
3344 ?        S      0:00 httpd -DPERLPROXIED -DHAV
3975 ?        S      0:00 httpd -DPERLPROXIED -DHAV
12342 pts/6    S      0:00 grep http

Si queremos eliminar la ultima linea podemos volver a usar grep con la opcion -v

$ ps ax | grep http | grep -v grep
3343 ?        S      0:00 httpd -DPERLPROXIED -DHAV
3344 ?        S      0:00 httpd -DPERLPROXIED -DHAV
3975 ?        S      0:00 httpd -DPERLPROXIED -DHAV

Se pueden filtrar las líneas que contengan la palabra linux del archivo arch1.txt y luego mostrarlas en un paginador como less.

$ cat arch1.txt | grep linux | less

Podemos enviar los resultados por correo a un amigo, con un asunto que diga "Tu archivo".

$ cat arch1.txt | grep linux | mail -s 'Tu archivo' amigo@email.com

Redirección

En repetidas ocaciones en la vida de un sistema es mejor tener todo en archivos, ya sea para guardar algún historial o para automatizar ciertas funciones dentro de scripts.

Para almacenar o sacar información de archivos y vincularlas con entradas o salidas estándares se utilizan las Redirecciones.

La redirección se expresa con los símbolos "Mayor" > y "Menor" <. Y se pueden utilizar en forma simple o doble.

Utilizando el comando cat se puede hacer una copia de arch1.txt a arch2.txt utilizando redirección.

$ cat arch1.txt > arch2.txt

O se puede redireccionar un archivo para visualizarlo con el comando less.

$ less < arch1.txt

Redirección de escritura (salida)

Para escribir un archivo se utiliza >. Hay que tener mucho cuidado de no borrar un archivo sobreescribiéndolo. Cuando se utilizan redirecciones, debido a su utilidad en los scripts, "no se realizan confirmaciones".

Si el archivo a escribir ya existe desde antes, el redireccionador > lo sobreescribe con flujo de texto nuevo.

En cambio el operador >> realiza un agregado de texto en el flujo existente.

No hay nada mejor que un ejemplo clarificador:

$ escribe-en-salida-estandar > archivo.txt 

El (falso) comando escribe-en-salida-estándar justamente hace eso, escribe unas cuantas cosas en salida estándar.

Puede ser un comando ls, un comando cal (calendario) o cualquier comando antes visto, así como también una combinación de comandos por tuberías.

En este punto, el contenido de archivo.txt es lo mismo que saldría en pantalla. Si ejecutamos otro comando redireccionado a archivo.txt (nuevamente), éste pierde su contenido y el resultado de la operación pasa a estar en el mismo.

Cuando se necesita tener una lista de acontecimientos, no se quiere que un acontecimiento nuevo borre a todos los anteriores. Para lograr esto agregamos en vez de sobreescribir.

$ echo Este es el acontecimiento Nro. 1 > bitacora.log
$ echo Este es el segundo acontecimiento >> bitacora.log

Va a escribir dos líneas en el archivo bitacora.log sin eliminar nada.

Ejemplo: Si queremos combinar el ejemplo de las tuberías con lo aprendido recientemente podríamos escribir:

$ cat archivo.txt | sort | sacar-repetidas | diccionario >> glosario.txt

Redirección de lectura (entrada)

Para la lectura es el símbolo menor < y se utiliza de la siguiente manera:

$ comando-que-acepta-stdin < archivo-de-entrada.txt

Como por ejemplo:

$ mail usuario1@micolegio.edu.ar usuario2@micolegio.edu.ar < correo.txt

Dónde correo.txt podría ser un archivo que se genere automáticamente... así como su contenido.

Otra facilidad para redireccionar entrada estándar es <<, que después de un comando, permite ingresar, por teclado, un texto que se constituirá en la entrada estándar.

A continuación de << debe ponerse una palabra, que indicará fin de entrada (en nuestro ejemplo, chau). La entrada estándar constará de las líneas que se digiten a continuación hasta la primera que contenga sólo la palabra que indicaba fin de entrada. Por ejemplo:

$ sort <<chau
> Perú
> Argentina
> Brasil
> chau
Argentina
Brasil
Perú

ordenará las palabras dadas (excepto chau que indica el fin de la entrada). Así, << es equivalente a editar un archivo y después redireccionarlo a la entrada estándar de un programa.

Crear, monitorear y matar procesos

Los estudiantes deberían poder administrar básicamente procesos.

Objetivos clave
Correr trabajos en primer y segundo plano.
Comenzar un proceso que corra sin estar asociado a una terminal.
Marcar un programa para que continue después del logout.
Monitorear procesos activos.
Seleccionar y ordenar procesos para verlos.
Enviar señales a los procesos.
Matar procesos, incluso aquellos que terminaron correctamente después que una sesión X se haya cerrado.
Archivos, términos y utilidades
& 
bg 
fg 
jobs 
kill 
nohup 
ps 
top
killall

&

Descripción

Este comando sirve para ejecutar un programa no interactivo en segundo plano. Agregando & al final del comando, bash comienza a ejecutarlo de una forma especial devolviendonos el control de prompt para seguir trabajando..

Ejemplos
scp usuario@servidor:/home/usuario/imagen.iso . &

La salida standar nos va a indicar el número de proceso

[1] 8962

En este caso el número de proceso es el 8962

jobs

Descripción

Este comando muestra una lista con las tareas detenidas mediante & o Control+Z.

Ejemplos
jobs
[1]+  Stopped scp usuario@servidor:/home/usuario/imagen.iso
[2]+  Stopped cdrecord -v -eject dev=0,0,0 speed=48 imagen2.iso

bg

Descripción

bg es un comando que permite ejecutar en segundo plano una tarea anteriormente detenida mediante Control+Z, es decir, puede ser re-arancado en segundo plano.

Ejemplos
scp usuario@servidor:/home/usuario/imagen.iso .
Control+Z
jobs
[1]+  Stopped scp usuario@servidor:/home/usuario/imagen.iso .

El [1] indica el numero de tarea detenida

bg 1
[1]+ scp usuario@servidor:/home/usuario/imagen.iso .

Reiniciada la tarea 1 en segundo plano

fg

Descripción

fg a difencia de bg es un comando que permite ejecutar en primer plano una tarea anteriormente detenida.

Ejemplos

scp usuario@servidor:/home/usuario/imagen.iso .

Control+Z
jobs
[1]+  Stopped scp usuario@servidor:/home/usuario/imagen.iso .

El [1] indica el numero de tarea detenida

fg 1
scp usuario@servidor:/home/usuario/imagen.iso .
password:

Como ven scp se vuelve interactivo nuevamente.

ps

Descripción

El comando ps nos permite observar todos los procesos que se están ejecutando en la pc, el mismo es muy adaptable ya que tiene muchas opciones para mostrarnos los datos. La forma mas común de utilizarlo es ps aux. Además de mostrar la lista de procesos, nos indica:

  • Número de proceso
  • Quien es el dueño
  • Cantidad de memoria consumida por el mismo
  • Cantidad de procesador consumida por el mismo
  • Hora de iniciado
  • Terminal desde la cual fue lanzado
  • Estado
Ejemplos
ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0    156    80 ?        S    18:09   0:00 init [5]
root         2  0.0  0.0      0     0 ?        S    18:09   0:00 [migration/0]
root         3  0.0  0.0      0     0 ?        SN   18:09   0:00 [ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S    18:09   0:00 [watchdog/0]
root         5  0.0  0.0      0     0 ?        S<   18:09   0:00 [events/0]
root         6  0.0  0.0      0     0 ?        S<   18:09   0:00 [khelper]
root         7  0.0  0.0      0     0 ?        S<   18:09   0:00 [kthread]
root         9  0.0  0.0      0     0 ?        S<   18:09   0:00 [kblockd/0]
root        10  0.0  0.0      0     0 ?        S<   18:09   0:00 [kacpid]
root       116  0.0  0.0      0     0 ?        S    18:09   0:00 [pdflush]
root       117  0.0  0.0      0     0 ?        S    18:09   0:00 [pdflush]
root       119  0.0  0.0      0     0 ?        S<   18:09   0:00 [aio/0]
root       118  0.0  0.0      0     0 ?        S    18:09   0:00 [kswapd0]
root       706  0.0  0.0      0     0 ?        S<   18:09   0:00 [kseriod]
root       767  0.0  0.0      0     0 ?        S<   18:09   0:00 [kpsmoused]
root      1069  0.0  0.0      0     0 ?        S<   18:09   0:00 [khubd]
root      1501  0.0  0.0      0     0 ?        S    18:09   0:00 [khpsbpkt]
root      2072  0.0  0.0      0     0 ?        S<   18:09   0:00 [scsi_eh_0]
root      2221  0.0  0.0      0     0 ?        S    18:09   0:00 [shpchpd_event]
root      3035  0.0  0.0      0     0 ?        S<   18:09   0:00 [kgameportd]
root      3596  0.0  0.2   1792   724 ?        Ss   18:10   0:00 pump -i eth0
root      3898  0.0  0.2   1652   572 ?        Ss   18:10   0:00 /sbin/syslogd
root      3901  0.0  0.1   1600   380 ?        Ss   18:10   0:00 /sbin/klogd
root      3953  0.0  1.8  11108  4712 ?        S    18:10   0:00 /usr/sbin/apache
root      4041  0.0  0.2   1744   672 ?        Ss   18:10   0:00 /usr/sbin/automount --pid-file=/var/run/autofs/_mnt_auto.pid --timeout=2 /mn
root      4049  0.0  0.7   5972  1920 ?        Ss   18:10   0:00 /usr/sbin/cupsd
www-data  4053  0.0  0.6  11108  1724 ?        S    18:10   0:00 /usr/sbin/apache
www-data  4054  0.0  0.6  11108  1716 ?        S    18:10   0:00 /usr/sbin/apache
www-data  4055  0.0  0.6  11108  1716 ?        S    18:10   0:00 /usr/sbin/apache
www-data  4056  0.0  0.6  11108  1716 ?        S    18:10   0:00 /usr/sbin/apache
www-data  4057  0.0  0.6  11108  1716 ?        S    18:10   0:00 /usr/sbin/apache
root      4508  0.0  0.5   2700  1336 ?        S    18:10   0:00 /bin/sh /usr/bin/mysqld_safe
mysql     4569  0.0  7.6 127260 19636 ?        Sl   18:10   0:02 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-
root      4570  0.0  0.1   1584   504 ?        S    18:10   0:00 logger -p daemon.err -t mysqld_safe -i -t mysqld
root      4634  0.0  0.4   3636  1024 ?        Ss   18:10   0:00 /usr/sbin/sshd
root      4733  0.0  0.8   8568  2276 ?        Ss   18:10   0:00 sendmail: MTA: accepting connections
root      4753  0.0  0.3   4436   812 ?        Ss   18:10   0:00 /usr/sbin/squid -D -sYC
proxy     4755  0.0  2.1   7416  5420 ?        S    18:10   0:00 (squid) -D -sYC
proxy     4757  0.0  0.1   1444   280 ?        Ss   18:10   0:00 (unlinkd)
daemon    4761  0.0  0.1   1852   416 ?        Ss   18:10   0:00 /usr/sbin/atd
root      4764  0.0  0.3   1868   820 ?        Ss   18:10   0:00 /usr/sbin/cron
root      4771  0.0  0.2   2640   620 ?        Ss   18:10   0:00 /usr/bin/kdm
root      4776  0.0  1.9   8788  4864 ?        Ss   18:10   0:00 /usr/bin/perl /usr/share/webmin/miniserv.pl /etc/webmin/miniserv.conf
root      4788  0.0  0.1   1596   496 tty1     Ss+  18:10   0:00 /sbin/getty 38400 tty1
root      4800  0.0  0.1   1600   500 tty3     Ss+  18:10   0:00 /sbin/getty 38400 tty3
root      4801  0.0  0.1   1600   492 tty4     Ss+  18:10   0:00 /sbin/getty 38400 tty4
root      4802  0.0  0.1   1596   496 tty5     Ss+  18:10   0:00 /sbin/getty 38400 tty5
root      4803  0.0  0.1   1596   496 tty6     Ss+  18:10   0:00 /sbin/getty 38400 tty6
root      4854  4.2  8.6  23640 22012 ?        S<   18:10   3:03 /usr/X11R6/bin/X -nolisten tcp -dpi 72 -br :0 vt7 -auth /var/run/xauth/A:0-3
root      4856  0.0  0.4   3256  1220 ?        S    18:10   0:00 -:0
root      5045  0.0  0.1   1600   496 tty2     Ss+  18:11   0:00 /sbin/getty 38400 tty2
guido     5095  0.0  0.6   5148  1628 ?        Ss   18:11   0:00 /bin/sh /usr/bin/startkde
guido     5126  0.0  0.2   3132   576 ?        Ss   18:11   0:00 /usr/bin/ssh-agent /usr/bin/startkde
guido     5149  0.0  2.7  25180  6996 ?        Ss   18:11   0:00 kdeinit Running...
guido     5152  0.0  0.9  24612  2412 ?        S    18:11   0:00 dcopserver [kdeinit] --nosid
guido     5154  0.0  3.0  26196  7696 ?        S    18:11   0:00 klauncher [kdeinit]
guido     5157  0.2  5.1  47140 13096 ?        Sl   18:11   0:09 kded [kdeinit]
guido     5173  0.0  3.3  26092  8588 ?        S    18:11   0:00 kaccess [kdeinit]
guido     5176  0.0  4.5  27872 11504 ?        S    18:11   0:00 kxkb [kdeinit]
guido     5177  0.0  0.1   1584   344 ?        S    18:11   0:00 kwrapper ksmserver
guido     5179  0.0  3.6  26296  9196 ?        S    18:11   0:00 ksmserver [kdeinit]
guido     5180  0.1  4.7  28720 12256 ?        S    18:11   0:07 kwin [kdeinit] -session 101a11bc130c1000114832797800000053190000_1153332512_
guido     5189  0.2  7.2  37300 18596 ?        S    18:11   0:08 kdesktop [kdeinit]
guido     5191  0.5  5.6  31936 14520 ?        S    18:11   0:21 kicker [kdeinit]
guido     5195  0.0  6.2  34228 15884 ?        S    18:11   0:01 knotes -session 101a11bc130c1000114951593800000052350081_1153332512_207602
guido     5198  0.1  5.3  30024 13756 ?        S    18:11   0:07 kmix [kdeinit] -session 101a11bc130c1000115144101400000117950006_1153332512_
guido     5199  1.6  4.7  35512 12052 ?        S    18:11   1:11 gkrellm --sm-client-id 101a11bc130c1000115283560600000054350008
guido     5201  0.0  2.7  25904  6912 ?        S    18:11   0:00 kio_file [kdeinit] file /tmp/ksocket-guido/klauncherBBbA0a.slave-socket /tmp
guido     5203  0.3  6.4  26236 16556 ?        S    18:11   0:16 /usr/bin/gaim --session 101a11bc130c1000115283550100000054350006
guido     5210  5.5 17.3 115224 44196 ?        Sl   18:11   3:55 /usr/lib/mozilla-firefox/firefox-bin -a firefox
guido     5214  0.0  4.1  33220 10680 ?        S    18:11   0:00 knotify [kdeinit]
guido     5238  0.0  0.9   6060  2372 ?        S    18:11   0:00 /usr/lib/libgconf2-4/gconfd-2 9
guido     9915  2.7  3.6  52056  9448 ?        Sl   19:04   0:30 xmms
guido    11104  0.4  5.4  30972 14016 ?        R    19:17   0:01 konsole [kdeinit]
guido    11106  0.1  1.6   7660  4228 pts/1    Ss   19:17   0:00 /bin/bash
¿Cómo buscar un proceso específico con ps?

Se puede utilizar ps para buscar un proceso utilizando un tuberia de la siguiente forma

ps aux | grep "nombre del proceso"

pstree

Descripción

Este comando es muy similar a ps, solo que pstree nos muestra la información en modo de árbol. Es muy útil para acostumbrarse al concepto de procesos.

Ejemplos
$ pstree

init-+-5*[agetty]
     |-bonobo-activati
     |-crond
     |-esd
     |-events/0
     |-firefox---run-mozilla.sh---firefox-bin---5*[{firefox-bin}]
     |-gaim
     |-gconfd-2
     |-gnome-keyring-d
     |-gnome-panel---{gnome-panel}
     |-gnome-settings----{gnome-settings-}
     |-gnome-terminal-+-bash---pstree
     |                |-gnome-pty-helpe
     |                `-{gnome-terminal}
     |-gnome-vfs-daemo---{gnome-vfs-daemo}
     |-gnome-volume-co
     |-gweather-applet
     |-jfsCommit
     |-jfsIO
     |-jfsSync
     |-kIrDAd
     |-khelper
     |-kjournald
     |-ksoftirqd/0
     |-kswapd0
     |-kthread-+-aio/0
     |         |-ata/0
     |         |-kacpid
     |         |-kblockd/0
     |         |-kgameportd
     |         |-khubd
     |         |-kpsmoused
     |         |-kseriod
     |         |-2*[pdflush]
     |         |-xfsdatad/0
     |         `-xfslogd/0
     |-login---bash---gnome-session-+-Xgl---Xorg
     |                              |-compiz
     |                              `-gnome-window-de
     |-mapping-daemon
     |-migration/0
     |-mixer_applet2
     |-nautilus---{nautilus}
     |-noip2
     |-notification-ar
     |-pure-ftpd
     |-shpchpd_event
     |-stickynotes_app
     |-syslog-ng
     |-udevd
     |-urxvt---bash
     |-watchdog/0
     `-wnck-applet

kill

Descripción

Este comando es utilizado para enviar señales a los procesos ejecutandose, generalmente las señales mas utilizadas son para terminar procesos. Vamos a ver dos formas de utilizar este comando:

  • SIGTERM (-15), envia una petición al proceso para que este termine, es decir, no fuerza la detención.
  • SIGKILL (-9), envia la señal para forzar las detención del proceso.
Ejemplos
kill -9 <número de proceso>

o

kill -15 <número de proceso>

killall

Descripción

Este comando es muy similar al kill, solo que este puede terminar procesos mediante el nombre y al eliminar un proceso determinado elemina a todos los hijos

Ejemplos
killall apache

Envia la señal SIGKILL al servicio apache

nohup

Descripción

nohup es utilizado para correr un comando suprimiendo la acción de la señal HUP (hangup), permitiendo al proceso seguir corriendo después de que el usuario que llamó al proceso se halla desconectado del sistema. El comando nohup produce un archivo con un detalle de sus usos.

Ejemplos
nohup wget http://www.gleducar.org.ar/imagen.iso

Después de esta linea, podemos desconectarnos del sistema sin dejar de bajar imagen.iso desde gleducar

Prioridades de ejecución de los procesos

Los estudiantes deberían poder administrar las prioridades de ejecución de los procesos.

Objetivos clave
Conocer la prioridad por defecto cuando un trabajo es creado.
Correr un programa con prioridad más alta o más baja que la que viene por defecto.
Cambiar la prioridad de procesos que están corriendo.
Archivos, términos y utilidades
nice 
ps 
renice 
top

nice

Descripción

Este comando nos permite especificar el valor NI de un proceso deteterminado. Siendo superusuario podemos subir y bajar este valor (dando o quitando prioridad al proceso), y en caso de que seamos un usuario no priviligeado solo podremos quitarle prioridad al proceso.

  • ¿Qué es NI?
NI es llamado el numero gentil o "nice number" , este numero es especificado por el "superusuario"("root") o dueño del proceso y afecta el orden final del PRI, le da prioridad a los menos gentiles.Sus valores oscilan desde -20 (menos gentil=mas prioridad) y 20 (mas gentil=menos prioridad).
Ejemplos
nice -10 <proceso> 
Esto bajaría la prioridad de <proceso> en 10 unidades.(Si estaba en -10, pasará a -20).
nice +10 <proceso> 
Esto incrementaría la prioridad de <proceso> en 10 unidades.(Si estaba en 0, pasaría a +10).

ps

Descripción

Este comando lista los procesos que estan teniendo lugar en el sistema con abundante información sobre ellos.

Ejemplos

Usamos el comando ps para listar los procesos de forma completa:

$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND 
root      4016  1.8  3.2  24640 16720 ?        S    08:38   1:17 gaim

Ahora, para trabajar concretamente en conjunto con la demas herramientas de prioridad de procesos (nice, renice, snice) usamos ps de la siguiente forma:

$ ps -la 
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0  3903  3902  5  75   0 - 24601 -      tty1     00:04:48 Xgl

Usando -la se despliegan dos parámetros PRI y NI. El parámetro PRI indica la prioridad actual del proceso, que es calculada por el sistema operativo, el valor de NI es tomado en cuenta cuando se determina el PRI.

renice

Descripción

Este comando nos permite reasignar la prioridad de un proceso que ya se encuentra en ejecución.

Ejemplos

Veamos un ejemplo claro donde vamos a hacer que un proceso se ejecute con menos prioridad. Primero listamos los procesos con un simple ps:

$ ps
PID TTY          TIME CMD
4096 pts/0    00:00:00 bash
4293 pts/0    00:00:00 analog

Ahora vamos a quitarle prioridad a la ejecución del proceso analog, con PID 4293:

$ renice +10 4239
4293: old priority 0, new priority 10

top

Descripción

Este comando lista, actualizandose cada 5 segundos, la actividad de la máquina (procesos que ocupan más memoria o CPU).

Una vez invocado, puede actualizarse inmediatamente (en lugar de esperar al intervalo) pulsando la barra espaciadora.

Ejemplos

Ejecutamos el comando top y vemos en pantalla la información de los procesos en tiempo real:

$ top
top - 10:10:15 up  1:48,  3 users,  load average: 0.12, 0.21, 0.26
Tasks:  68 total,   1 running,  67 sleeping,   0 stopped,   0 zombie
Cpu(s): 23.2% us,  4.6% sy,  0.0% ni, 71.5% id,  0.0% wa,  0.3% hi,  0.3% si
Mem:    515148k total,   502384k used,    12764k free,    12404k buffers
Swap:   488336k total,       12k used,   488324k free,   260680k cached

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
3903 root      16   0  108m  83m  10m S 21.9 16.5   5:35.15 Xgl
4094 root      15   0 29084  11m 8348 S  4.3  2.3   0:04.57 gnome-terminal
3906 root      15   0  9168 4272 3032 S  1.3  0.8   0:10.13 compiz

Archivos de texto y expresiones regulares

Los estudiantes deberían poder manipular archivos y texto usando expresiones regulares. Este objetivo incluye la creación de expresiones regulares simples que contengan los más importantes elementos no textuales. También incluye usar expresiones regulares para ejecutar búsquedas en el sistema de archivos o el contenido de los archivos.

Objetivos clave
Crear expresiones regulares simples conteniendo los más importantes elementos no textuales.
Usar expresiones regulares para realizar búsquedas en el sistema de archivos o dentro de los archivos.
Archivos, términos y utilidades
grep
sed

grep

sed

Edición de archivos de texto

Los estudiantes deberían poder editar archivos de texto usando vi. Este objetivo incluye navegación con vi, modos básicos de vi, inserción, edición, borrado, copia y búsqueda de texto.

Objetivos clave
Navegar un documento usando vi.
Uso de los modos básicos de vi (comandos, inserción y reemplazo)
Insertar, editar, borrar, copiar y buscar texto.
Archivos, términos y utilidades
vi
/, ?
h,j,k,l
G, H, L
i, c, d, dd, p, o, a
ZZ, :w!, :q!, :e!
:!

vi

Vi es un editor de texto que se encuentra en (casi) todo sistema de tipo Unix, de forma que conocer rudimentos de Vi es una salvaguarda ante operaciones de emergencia en diversos sistemas operativos.

Abrir un archivo

Simplemente pasamos como parámetro el nombre del archivo a editar. Si no existe un archivo con tal nombre, al grabar nuestor trabajo en vi se guardará con dicho nombre:

$ vi archivo

Modo Comando y Modo Inserción

Vi es un editor con dos modos: edición y comandos. En el modo de edición el texto que ingrese será agregado al texto, en modo de comandos las teclas que oprima pueden representar algún comando de vi.

Edición simple

Posicionáte sobre el area del texto que quieras editar y presiona la tecla i o <Insertar>. Ahora estarás en condicione de agregar o eliminar texto. Para volver al modo comando tan solo presiona <Escape>.

En el modo comando, puedes efectuar alguna de las siguientes operaciones básicas:

  • x borra caracter
  • dw borra palabra
  • dd borra línea
  • r reemplaza un caracter sobre el cursor
  • R reemplaza un string de caracteres (sobreescribe)
  • cw cambia una palabra
  • s sustituye un caracter por un string
  • . repite el ultimo cambio

Guardar el trabajo

Si lo que quieres es guardar los cambios en otro archivo, escribe :w nombrearchivo.txt para guardarlo como nombrearchivo.txt. Si quieres guardar y salir, teclea :x o :wq

Salir de vi

Escribiendo :q saldrás de vi. Si no funciona, seguramente se deberá a que, de alguna forma, has modificado el archivo accidentalmente. Para decirle a vi que queremos salir y descartar todos los cambios, escribiremos :q!. En estos momentos deberías estar en la línea de comandos.

Copiar, cortar y pegar

Copiar y pegar

El procedimiento para copiar una ó más líneas, es el siguiente:

  • Colocarse en la primera línea a copiar.
  • Escribir el número de líneas que se desea copiar.
  • Teclear yy ó Y (comando yank ).
  • Colocarse en la línea a donde se desean copiar
  • Teclear p ó P (comando pegar )
Cortar y pegar

El procedimiento para mover una ó varias líneas es el siguiente:

  • Colocarse en la primera línea a cortar.
  • Escribir el número de líneas que se desea cortar.
  • Teclear dd (comando delete ).
  • Colocarse en la línea a donde se desean pegar
  • Teclear p ó P (comando pegar)

Buscar y reemplazar

Buscando

Para encontrar un string, hay que escribir una barra hacia la derecha (/) seguida por el string que se desea buscar, y pulsar return.

El vi posiciona el cursor en la siguiente ocurrencia del string. Tecleando n se va a la siguiente ocurrencia del string, y pulsando N a la anterior.

Si en lugar de una barra se escribiese una interrogación (?), la búsqueda sería hacia atrás, y las direcciones de las órdenes n y N se invertirían.

Reemplazando texto

El procedimiento para reemplazar un string está es similar al de búsqueda arriba mencionado. Todos los caracteres especiales de emparejamiento se pueden usar también en una búsqueda+reemplazamiento.

La forma básica de la orden es:

:g/string_buscado/s//string_cambiado/g 

Se puede modificar el comando para parar la búsqueda y hacer que el vi pida confirmación antes de realizar el reemplazo, mediante la orden gc (consult), respondiendo y (sí) o n (no).

Para terminar el proceso bastaría con pulsar Ctrl-C

Diapositivas de la clase

Bibliografía



Volver a Contenidos de la capacitación técnica 2006
Copyright © 2002-2010 Asociación Civil Gleducar
Todo los contenidos de este sitio se encuentran bajo una licencia libre del tipo Copyleft
Este sitio ha sido desarrollado usando Software Libre y respeta los estándares web.
Además ha sido diseñado para verse correctamente usando cualquier navegador, en cualquier resolución de pantalla.