Comandos Unix y GNU

De XTech Capacitacion

Tabla de contenidos

Distintos intérpretes de comandos (shell)

Una shell es un intérprete de comandos, es decir, se trata de un programa especializado para aceptar comandos ingresados por el usuario, traduciendo aquellos en programas para ejecutarse, ejecutando esos programas, y mostrándolos (o haciendo algo) con los resultados. Un ejemplo conocido por muchos es la shell de DOS, llamada COMMAND.COM. que era la interfaz de usuario completa, antes de Windows.

Existen diferentes shells, que ofrecen diferentes características. Hay dos familias: las shell Bourn y sus variantes (sh, bash, ksh) y la shell C y sus variantes (csh, tcsh). Aunque muchas shells tienen características comunes a otras, la manera en que las usan es única, de manera que (por ejemplo) las convenciones de la shell Bourne usualmente no se aplican a las shells C.

bash(bourne-again shell)
es la shell predeterminada para los usuarios de Linux. es compatible con la tradicional shell Bourne (sh), los scripts de hechos en sh funcionarán en bash, aunque hay algunas características específicas a bash que no funcionarán en shells Bourne más viejas.

Existen distintos tipos de shells bash:

  • De sesión (login shells)
  • Interactivas
  • No interactivas
Las shells de sesión son aquellas a las que se accede al intérprete de
comando mediante un inicio de sesión (usualmente ingresando el nombre de
usuario y la contraseña).
Una shell interactiva es aquella en la que el usuario puede interactuar
(por ejemplo respondiendo a preguntas en pantalla).
Una shell no interactiva es cuando el usuario no interviene, por ejemplo,
durante la ejecución de un script.

Es muy importante conocer los archivos de configuración de Bash, así como también el orden en que son leídos:

Shell de sesión e interactiva
  • /etc/profile
  • ~/.bash_profile
  • ~/.bash_logout
  • ~/.profile
  • Cuando un usuario cierra una sesión bash lee el archivo ~/.bash_logout
Shell interactivo sin sesión
  • ~/.bashrc
Shell no interactivo sin sesión
  • Se busca una variable de entorno ($BASH_ENV) que de existir contiene un archivo de configuración (por ejemplo: ~/.bashrc)

Administración básica de archivos

Información de archivos y directorios (ls)

Una de las herramientas fundamentales para mostrar contenidos de directorios y propiedades de archivos es el comando ls. Mostrar el contenido del directorio actual

[sergio@hibernia ~]$ ls
bin/       Desktop/     example    Fotos/                  Música/    PicasaDocuments/  usr/    vmware/
Descarga/  Documentos/  Facultad/  Little_Debian-0.5b.iso  nohup.out  tmp/              Vídeo/
[sergio@hibernia ~]$


Mostrar el contenido de manera detallada de otro directorio
[sergio@hibernia ~]$ ls /boot
config@                              initrd-2.6.17.3.img                  System.map-2.6.12-22mdk
config-2.6.12-19mdk-i586-up-1GB      initrd.img@                          System.map-2.6.14.3-vs2.0.1
config-2.6.12-22mdk                  kernel.h@                            System.map-2.6.16-vs2.1.1-rc15
config-2.6.14.3-vs2.0.1              kernel.h-2.6.12-19mdk-i586-up-1GB    System.map-2.6.17.3
config-2.6.16-vs2.1.1-rc15           kernel.h-2.6.12-22mdk                vmlinuz@
config-2.6.17.3                      kernel.h-2.6.14.3-vs2.0.1            vmlinuz-2.6.12-19mdk-i586-up-1GB
grub/                                kernel.h-2.6.16-vs2.1.1-rc15         vmlinuz-2.6.12-22mdk
initrd-2.6.12-19mdk-i586-up-1GB.img  kernel.h-2.6.17.3                    vmlinuz-2.6.14.3-vs2.0.1
initrd-2.6.12-22mdk.img              message-graphic                      vmlinuz-2.6.16-vs2.1.1-rc15
initrd-2.6.14.3-vs2.0.1              System.map@                          vmlinuz-2.6.17.3
initrd-2.6.16-vs2.1.1-rc15.img       System.map-2.6.12-19mdk-i586-up-1GB
[sergio@hibernia ~]$


Mostrar de manera detallada el contenido de un directorio
[sergio@hibernia ~]$ ls -l /boot
total 11960
lrwxrwxrwx  1 root root      19 jul 21 14:45 config -> config-2.6.12-22mdk
-rw-r--r--  1 root root   71251 abr 10 14:30 config-2.6.12-19mdk-i586-up-1GB
-rw-r--r--  1 root root   71311 may 23 20:30 config-2.6.12-22mdk
-rw-r--r--  1 root root   65344 mar 29 13:39 config-2.6.14.3-vs2.0.1
-rw-r--r--  1 root root   67854 jul  3 23:55 config-2.6.16-vs2.1.1-rc15
-rw-r--r--  1 root root   66208 jul  3 17:46 config-2.6.17.3
drwxr-xr-x  2 root root    4096 jul 13 22:27 grub/
-rw-r--r--  1 root root  148244 may 30 00:44 initrd-2.6.12-19mdk-i586-up-1GB.img
-rw-r--r--  1 root root  151414 may 30 19:04 initrd-2.6.12-22mdk.img
-rw-r--r--  1 root root  123715 jul 13 19:07 initrd-2.6.14.3-vs2.0.1
-rw-r--r--  1 root root  151152 jul  3 23:55 initrd-2.6.16-vs2.1.1-rc15.img
-rw-r--r--  1 root root  151825 jul  3 17:46 initrd-2.6.17.3.img
lrwxrwxrwx  1 root root      23 may 30 19:04 initrd.img -> initrd-2.6.12-22mdk.img
lrwxrwxrwx  1 root root      27 jul 21 14:46 kernel.h -> /boot/kernel.h-2.6.12-22mdk
-rw-r--r--  1 root root     695 may 30 00:24 kernel.h-2.6.12-19mdk-i586-up-1GB
-rw-r--r--  1 root root     695 jun 11 16:42 kernel.h-2.6.12-22mdk
-rw-r--r--  1 root root     695 jul 13 19:15 kernel.h-2.6.14.3-vs2.0.1
-rw-r--r--  1 root root     695 jul  4 20:03 kernel.h-2.6.16-vs2.1.1-rc15
-rw-r--r--  1 root root     695 jul  3 17:57 kernel.h-2.6.17.3
-rw-r--r--  1 root root  287644 jul  3 23:55 message-graphic
lrwxrwxrwx  1 root root      23 jul 15 10:07 System.map -> System.map-2.6.12-22mdk
-rw-r--r--  1 root root  638659 abr 10 14:30 System.map-2.6.12-19mdk-i586-up-1GB
-rw-r--r--  1 root root  641499 may 23 20:30 System.map-2.6.12-22mdk
-rw-r--r--  1 root root  617943 mar 29 13:39 System.map-2.6.14.3-vs2.0.1
-rw-r--r--  1 root root  603665 jul  3 23:55 System.map-2.6.16-vs2.1.1-rc15
-rw-r--r--  1 root root  599816 jul  3 17:46 System.map-2.6.17.3
lrwxrwxrwx  1 root root      20 may 30 19:04 vmlinuz -> vmlinuz-2.6.12-22mdk
-rw-r--r--  1 root root 1569872 abr 10 14:30 vmlinuz-2.6.12-19mdk-i586-up-1GB
-rw-r--r--  1 root root 1612094 may 23 20:30 vmlinuz-2.6.12-22mdk
-rw-r--r--  1 root root 1464849 mar 29 13:39 vmlinuz-2.6.14.3-vs2.0.1
-rw-r--r--  1 root root 1521143 jul  3 23:55 vmlinuz-2.6.16-vs2.1.1-rc15
-rw-r--r--  1 root root 1467908 jul  3 17:46 vmlinuz-2.6.17.3
[sergio@hibernia ~]$
Ver las propiedades de un archivo
[sergio@hibernia ~]$ ls -l /var/log/messages
-rw-r-----  1 root root 3151140 jul 21 16:49 /var/log/messages

Mostrar todos los archivos de un directorio (incluyendo los ocultos)

[sergio@hibernia ~]$ ls -a
./                                              .gnome2_private/        nohup.out
../                                             .gnupg/                 .nvidia-settings-rc
.bash_history*                                  .googleearth/           .nvu/
.bash_logout*                                   .gpg-server             .nx/
.bash_logout~*                                  .gstreamer-0.8/         .oofficerc*
.bash_profile*                                  .gtk-bookmarks          .ooo-2.0/
.bashrc*                                        .i18n*                  .openoffice/
.bashrc~*                                       .ICEauthority           .opera/
bin/                                            .icewm/                 .phish/
.bmp/                                           .icons/                 .picasa/
.bogofilter/                                    .inkscape/              PicasaDocuments/
.bygfoot-1.9/                                   .java/                  .qt/
.ccpublisher/                                   .kbfx/                  .quodlibet/
.config/                                        .kde/                   .recently-used
.DCOPserver_81-201-126-200.fibertel.com.ar__0*  .kderc                  .sane/
.DCOPserver_81-201-126-200.fibertel.com.ar_:0@  .keychain/              .screenrc*
.DCOPserver_hibernia.ireland.biz.ar__0          .klamav/                .so_sane_state
.DCOPserver_hibernia.ireland.biz.ar_:0@         .links/                 .ssh/
Descarga/                                       .linuxconf/             .superkaramba/
.desktop*                                       Little_Debian-0.5b.iso  .sversionrc*
Desktop/                                        .local/                 .thumbnails/
.dmrc*                                          .loki/                  .thunderbird/
Documentos/                                     .lpoptions              tmp/
.dvdcss/                                        .macromedia/            .torcs/
.eboard/                                        .mailcap*               .twm/
.esd_auth                                       .mc/                    usr/
example                                         .mcop/                  Vídeo/
Facultad/                                       .mcoprc                 .viminfo
.fonts/                                         .mdk-folders/           .vlc/
.fonts.cache-1                                  .MdkOnline/             vmware/
.fonts.cache-1.TMP-l8qGwJ                       .menu/                  .vmware/
.fonts.conf                                     .menu-updates.stamp     .wapi/
Fotos/                                          .mime.types*            .wine/
.gconf/                                         .mindawn/               .Xauthority
.gconfd/                                        .mozilla/               .xine/
.gimp-2.2/                                      .mplayer/               .xmms/
.gnome/                                         Música/                 .xmoto/
.gnome2/                                        .net_monitorrc*         .xsession-errors
[sergio@hibernia ~]$  

Ordenar los archivos de acuerdo aun criterio diferente
[sergio@hibernia ~]$ ls -l --sort=time
total 452828
drwx------  45 sergio sergio      4096 jul 21 16:49 tmp/
-rw-r--r--   1 sergio sergio         0 jul 21 16:01 example
drwx------   2 sergio sergio      4096 jul 20 12:22 Desktop/
-rw-r--r--   1 sergio sergio 462002176 jul 17 16:40 Little_Debian-0.5b.iso
-rw-------   1 sergio sergio   1177401 jul 17 11:41 nohup.out
drwxr-xr-x   2 sergio sergio      4096 jul 15 16:46 bin/
drwx------  23 sergio sergio      4096 jul 10 20:56 Descarga/
drwx------   2 sergio sergio      4096 jul 10 17:31 Vídeo/
drwx------  22 sergio sergio      4096 jun 28 17:25 Documentos/
drwxrwxr-x   2 sergio sergio      4096 jun 25 18:34 usr/
drwx------   5 sergio sergio      4096 jun 24 01:40 Fotos/
drwxrwxr-x   2 sergio sergio      4096 jun 22 09:08 Facultad/
drwxrwxr-x   2 sergio sergio      4096 jun  8 00:29 vmware/
drwxr-xr-x   5 sergio sergio      4096 jun  1 00:32 PicasaDocuments/
drwx------   2 sergio sergio      4096 may 30 07:32 Música/
[sergio@hibernia ~]$

Creación archivos (touch)

El comando touch se suele usar para crear archivos vacíos. Por ejemplo:

[sergio@hibernia tmp]$ touch un_archivo
[sergio@hibernia tmp]$ ls
gconfd-sergio/  gpg-5bxcaP/  gpg-u0fM8L/  pdf.log  ssh-VhIvUL5990/  un_archivo
[sergio@hibernia tmp]$

El comando touch sirve también para modificar las fechas de un archivo, tal como se como muestra a continuación:

[sergio@hibernia tmp]$ stat un_archivo
  File: «un_archivo»
  Size: 21              Blocks: 8          IO Block: 4096   fichero regular
Device: 10h/16d Inode: 25855       Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/  sergio)   Gid: (  500/  sergio)
Access: 2006-07-21 16:05:53.000000000 -0300
Modify: 2006-07-21 16:05:59.254776824 -0300
Change: 2006-07-21 16:05:59.254776824 -0300
[sergio@hibernia tmp]$ touch un_archivo
[sergio@hibernia tmp]$ stat un_archivo
  File: «un_archivo»
  Size: 21              Blocks: 8          IO Block: 4096   fichero regular
Device: 10h/16d Inode: 25855       Links: 1
Access: (0644/-rw-r--r--)  Uid: (  500/  sergio)   Gid: (  500/  sergio)
Access: 2006-07-21 16:08:21.000000000 -0300
Modify: 2006-07-21 16:08:21.000000000 -0300
Change: 2006-07-21 16:08:21.000000000 -0300
[sergio@hibernia tmp]$

Creación de directorios (mkdir)

El comando mkdir sirve para crear directorios. Por ejemplo:

[sergio@hibernia tmp]$ mkdir ulster
[sergio@hibernia tmp]$ ls
gconfd-sergio/  gpg-5bxcaP/  gpg-u0fM8L/  pdf.log  ssh-VhIvUL5990/  ulster/  un_archivo

También se pueden crear varios directorios al mismo tiempo, tal como se muestra debajo:

[sergio@hibernia tmp]$ ls
connacht/       gpg-5bxcaP/  leinster/  pdf.log          ulster/
gconfd-sergio/  gpg-u0fM8L/  munster/   ssh-VhIvUL5990/  un_archivo


Crear un árbol de directorios

Si queremos crear un árbol completo de directorios, no podemos hacerlo directamente con mkdir. Necesitaríamos crear de a uno y desde el nivel superior a las puntas.

roman@donkey:~$ mkdir transportes/terrestres/autos/sedanes
mkdir: no se puede crear el directorio «transportes/terrestres/autos/sedanes»: No existe el fichero ó directorio

Con mkdir -p, sí podemos hacerlo en un solo paso.

roman@donkey:~$ mkdir -p transportes/terrestres/autos/sedanes
roman@donkey:~$ ls -R transportes/
transportes/:
terrestres

transportes/terrestres:
autos

transportes/terrestres/autos:
sedanes

transportes/terrestres/autos/sedanes:
roman@donkey:~$

Copiado de archivos (cp)

El comando cp es el indicado para copiar archivos, como se muestra debajo:

[sergio@hibernia tmp]$ cp un_archivo leinster/
[sergio@hibernia tmp]$ ls  .  leinster/
.:
connacht/       gpg-5bxcaP/  leinster/   munster/  ssh-VhIvUL5990/  un_archivo
gconfd-sergio/  gpg-u0fM8L/  mamíferos/  pdf.log   ulster/

leinster/:
un_archivo
Copiado de directorios

Copiar directorios se realiza con el comando cp y algunas de las opciones de recursividad:

[sergio@hibernia tmp]$ mkdir pruebas
[sergio@hibernia tmp]$ cp -r leinster/ pruebas/
[sergio@hibernia tmp]$ ls . pruebas/
.:
connacht/       gpg-5bxcaP/  leinster/   munster/  pruebas/         ulster/
gconfd-sergio/  gpg-u0fM8L/  mamíferos/  pdf.log   ssh-VhIvUL5990/  un_archivo

pruebas/:
leinster/

Movimiento de archivos (mv)

El comando mv sirve para mover archivos.

[sergio@hibernia tmp]$ mv un_archivo ulster/
[sergio@hibernia tmp]$ ls ulster/
un_archivo

Los directorios se mueven de igual manera, mv no necesita la opción de recursividad.

Cambio de nombres de archivos

Para cambiar nombres de archivo también se utiliza el comando mv, por ejemplo si desea cambiar el nombre del directorio equidnas por ornitorrinco se hace así:

[sergio@hibernia tmp]$ mv mamíferos/monotremas/equidnas/ mamíferos/monotremas/ornitorrincos
[sergio@hibernia tmp]$ ls mamíferos/monotremas/
ornitorrincos/

Borrar archivos (rm)

A fin de borrar archivos se usa el comando rm, tal como se muestra debajo:

sergio@hibernia tmp]$ ls
connacht/       gpg-5bxcaP/  leinster/   munster/  pruebas/         ulster/
gconfd-sergio/  gpg-u0fM8L/  mamíferos/  pdf.log   ssh-VhIvUL5990/
[sergio@hibernia tmp]$ rm pdf.log
rm: ¿borrar el fichero regular «pdf.log»? (s/n) s
[sergio@hibernia tmp]$ ls
connacht/       gpg-5bxcaP/  leinster/   munster/  ssh-VhIvUL5990/
gconfd-sergio/  gpg-u0fM8L/  mamíferos/  pruebas/  ulster/

Atención: El comando rm por defecto no pregunta y borra directamente un archivo. Sin embargo, muchas distribuciones tienen creados alias para proporcionar interactividad comandos, tales como cp, mv y rm.

De acuerdo a LinuxWiki de LinuxQuestions.org:

"Un alias es simplemente eso - otro nombre con el cual referirse a un comando. Los aliases le permiten crear nombres más cortos o más familiares para comandos usados comúnmente. Otro beneficio yace en ser capaz no solamente de apodar el comando, sino también algumentos tambien."

Es decir cuando se invocan los comandos cp, mv y rm en realidad se invocan esos comandos con las opciones de interactividad, esto se puede ver al ejecutar el comando alias:

[sergio@hibernia tmp]$ alias
alias cd..='cd ..'
alias cp='cp -i'
alias d='ls'
alias df='df -h -x supermount'
alias du='du -h'
alias fisos='clear && find / -name "*.iso" 2> /dev/null'
alias kde='xinit /usr/bin/startkde'
alias l='ls'
alias la='ls -a'
alias ll='ls -l'
alias ls='ls -F --show-control-chars --color=auto'
alias lsd='ls -d */'
alias mc='. /usr/share/mc/bin/mc-wrapper.sh'
alias md='mkdir'
alias mv='mv -i'
alias p='cd -'
alias rd='rmdir'
alias rm='rm -i'
alias s='cd ..'
Borrar directorios con contenido

Para eliminar directorios que contengan archivos y/o directorios se debe usar el comando rm con la opción de recursividad, tal como se muestra debajo:

[sergio@hibernia ~]$ rm -r folder1/
rm: ¿descender al directorio «folder1/»? (s/n) s
rm: ¿borrar el fichero regular vacío «folder1//file1»? (s/n) s
rm: ¿descender al directorio «folder1//folder2»? (s/n) s
rm: ¿borrar el fichero regular vacío «folder1//folder2/file2»? (s/n) s
rm: ¿borrar el directorio «folder1//folder2»? (s/n) s
rm: ¿borrar el directorio «folder1/»? (s/n) s

Borrar directorios vacíos (rmdir)

Para borrar directorios vacíos (o que contengan solamente directorios) se usa el comando rmdir tal como se ve a continuación:

[sergio@hibernia ~]$ mkdir -p a/b/c
[sergio@hibernia ~]$ rmdir  -p a/b/c

File Globbing

Se llama File Globbing a determinados carácteres o patrones que usa la shell para realizar la expansión de un nombre de ruta. Los tres patrones principales son: *, ? y [].

Asterisco "*"
El asterisco se expande a cualquier cantidad de caracteres, exceptuando aquellas cadenas de texto que comienzan con un punto (.)
[sergio@hibernia ~]$ ls /bin/k*
/bin/kill*  /bin/ksh*
Atención: el asterisco aplica recursividad al encontrar subdirectorios en el directorio actual
Signo de interrogación "?"
El signo de interrogacción se expande a un único carácter y en la posición exacta.
[sergio@hibernia ~]$ ls /usr/bin/??ir
/usr/bin/hdir*  /usr/bin/mdir@  /usr/bin/vdir*
Corchetes "[]"
Los corchetes se asemejan a los signos de interrogación, pero son más potentes aun, por ejemplo se quiere mostrar un listado de los archivos que comienzan con k y con s en el directorio /bin:
[sergio@hibernia ~]$ ls /bin/[ks]*
/bin/kill*  /bin/sed*        /bin/sfxload*  /bin/sleep*  /bin/stat*  /bin/su*
/bin/ksh*   /bin/setserial*  /bin/sh@       /bin/sort*   /bin/stty*  /bin/sync*
Siguiendo el ejemplo anterior, los corchetes también permiten hacer un listado de aquellos archivos que comienzan por letras que van desde la k hasta la s inclusive:
[sergio@hibernia ~]$ ls /bin/[k-s]*
/bin/kill*       /bin/mail*        /bin/mount.cifs3*    /bin/pidof@         /bin/rm*     /bin/setserial*  /bin/su*
/bin/ksh*        /bin/mkdir*       /bin/mountpoint*     /bin/ping*          /bin/rmdir*  /bin/sfxload*    /bin/sync*
/bin/link*       /bin/mknod*       /bin/mv*             /bin/procps3-kill*  /bin/rpm*    /bin/sh@
/bin/linuxconf@  /bin/mktemp*      /bin/netstat*        /bin/progress*      /bin/rvi@    /bin/sleep*
/bin/ln*         /bin/more*        /bin/nice*           /bin/ps*            /bin/rview@  /bin/sort*
/bin/login*      /bin/mount*       /bin/nisdomainname@  /bin/pwd*           /bin/rvim@   /bin/stat*
/bin/ls*         /bin/mount.cifs@  /bin/open*           /bin/rbash@         /bin/sed*    /bin/stty*
Por supuesto, también se pueden usar corchetes con números, por ejemplo:
[sergio@hibernia ~]$ ls -l  /var/log/Xorg.[0-5].log
-rw-r-----  1 root root 34889 jul 24 12:41 /var/log/Xorg.0.log
-rw-r-----  1 root root 34598 jul 20 00:20 /var/log/Xorg.1.log
-rw-r-----  1 root root  1331 jun 11 16:32 /var/log/Xorg.5.log

Flujos, Tuberías y Redireccionamientos

Redireccionamientos

Un proceso es un programa en ejecución. Se utilizan por lo menos tres archivos que describen los archivos abiertos a los cuales accede el proceso. 0 corresponde a la entrada, 1 a la salida, y 2 al error.

La entrada estándar es el teclado, la salida estándar aparece por pantalla, mientras que el error a pesar de salir también por pantalla, va por un canal distinto.

Cada uno de los descriptores de archivos se pueden redirigir hacia otros archivos, en lugar de usar el teclado o la pantalla, tal como se muestra en los siguientes ejemplos:

Redireccionamiento de entrada
[sergio@hibernia ~]$ wc -l < /etc/passwd
34
Redireccionamiento de salida
[sergio@hibernia ~]$ ls /usr/bin/k* > kbinarios
[sergio@hibernia ~]$ wc -l kbinarios
352 kbinarios
Redireccionamiento de error
[sergio@hibernia ~]$ find / -type p 2> errores
/dev/initctl
/var/run/xdmctl/xdmctl
/var/run/xdmctl/xdmctl-:0
/ocho/dev/initctl
Redireccionamiento de error y salida a distintos archivos
[sergio@hibernia ~]$ find / -type p 2> errores 1> tuberias
[sergio@hibernia ~]$ cat tuberias
/dev/initctl
/var/run/xdmctl/xdmctl
/var/run/xdmctl/xdmctl-:0
/ocho/dev/initctl


Redireccionamiento de error y salida al mismo archivo
[sergio@hibernia ~]$ find / -type p > allinone 2>&1
Redirecciomiento destructivo y aditivo
[sergio@hibernia ~]$ echo hola > saludo
[sergio@hibernia ~]$ cat saludo
hola
[sergio@hibernia ~]$ echo chau  > saludo
[sergio@hibernia ~]$ cat saludo
chau
[sergio@hibernia ~]$ echo hola >> saludo
[sergio@hibernia ~]$ cat saludo
chau
hola

Tuberías (Pipes)

Una tubería es el método que consiste en enviar la salida estándar de un proceso a la entrada estándar de otro. En esencia, la salida del programa es modificada o usada por medio de otro. En la mayoría de las shells, esto se hace poniendo al carácter "|" (sin las comillas) entre los comandos.

Uso de shell

Las tuberías permiten capacidades de procesamiento de texto eficiente con las que Unix y los sistemas similares fueron diseñados, entre otras capacidades.

Un ejemplo es usar la salida de dmesg como entrada para grep para mostrar solamente las líneas que contienen una cadena de texto determinada:

$ dmesg | grep EXT3

EXT3-fs warning: maximal mount count reached, running e2fsck is recommended
EXT3 FS on hda5, internal journal 
EXT3-fs: mounted filesystem with ordered data mode.
$

Quizá, se necesite encontrar todas los números de líneas donde Gimli se menciona en el Señor de los Anillos. El comando nl imprimirá los números de línea sobre las cosas que se entuban en ella. Se puede entonces hacer un grep por Gimli para clasificar las líneas que se buscan. Hay un montón de líneas sin embargo, de manera que se puede usar more (o less) para mostrar una pantalla a la vez (presionar la barra espaciadora para ver más):

$ cat Lord_of_the_rings.txt | nl | grep Gimli | more

9592     There was a younger dwarf at Glóin's side: his son Gimli. Beside
11064     shall be for the Elves; and Gimli son of Glóin for the Dwarves. They
11220     Gimli the dwarf alone wore openly a short shirt of steel-rings, for
11276     the road darkens,' said Gimli.
11279     'Yet sworn word may strengthen quaking heart,' said Gimli.
--More--

Comandos útiles para ejecutar luego de tuberías

  • cat para volcar archivos
  • nl para enumerar líneas
  • wc para contar palabras
  • grep para busca expresiones regulares por líneas
  • ppt para convertirla en entrada para una ticker tape
  • netpbm para trabajar con imágenes
  • sed y awk para procesar textos
  • xargs para usar la entrada como argumentos para un comando en lugar de la salida estándar.


El comando xargs

El comando xargs permite ejecutar un programa con muchos, muchos argumentos. Si hay demasiados argumentos, xargs los dividirá en múltiples listas. Es particularmente útil con el comando find, de manera que se incluye en las herramientas de búsqueda GNU.

find -name "*~" | xargs rm

En este ejemplo, se podría usar el comando -exec de find. Pero, si hay 100000, find -exec ejecutará rm 100000 veces, mientras que find | xargs solamente ejecutará rm quizá cuatro veces.

Bifurcaciones con el comando tee

Ejemplo rápido de como imprimir la salida de un comando a un archivo. Ejecutar el siguiente comando para obtener un listado de directorio en la terminal, mientras también se redirige la salida a un archivo llamado terminal.out.:

ls -al | tee terminal.out

ahora

cat terminal.out

Ejemplo de bifurcación:

[sergio@hibernia ~]$ ls -a /sbin  | tee sbin | wc -l
375

En el ejemplo de arriba parece como si la salida de ls se hubiese bifurcado: por un lado hacia el comando tee y por el otro hacia wc.


Los comandos más relevantes relacionados a tee son:

   * tpipe
   * tee-pipe
   * script
   * lsof
   * script

Procesamiento de flujo de texto usando filtros

Comando cat

Cat es aparentemente una herramienta usada para concatenar (esto es, encadenar uno con otro) un número de archivos a la salida estándar, pero en la práctica es frecuentemente usado para mostrar los contenidos de un archivo a la salida estándar, o usándolo para crear pequeños archivos o usarla terminal como un bloc de notas (usando redirección de shell).

Ejemplo de concatenación de archivos en salida estándar:

[sergio@hibernia ~]$ cat /proc/ide/hda/driver /proc/ide/hdc/driver
ide-disk version 1.18
ide-cdrom version 4.61

Comando cut

El comando cut es un programa conveniente para extraer piezas de una línea de texto. Las opciones más comunes son -d y -f, que están para definir el carácter delimitador que separa los items, y para decirle a cut que "campos" se desean imprimir.

Por ejemplo, suponiendo que se tiene la siguiente línea de texto, y solamente se quiere la 3ª y la 6º columna:

touch lista
echo "foo,bar,baz,stuff,blah,oogabooga" > lista
[sergio@hibernia ~]$ cat lista|cut -d',' -f 3,6
baz,oogabooga

Comando expand

Reemplaza los tabuladores por espacios en archivos de texto. También se puede usar la entrada estándar en vez de un archivo.

Comando fmt

Cambia el formato de cada párrafo intentando que todas las líneas terminen en la misma columa.

[sergio@hibernia ~]$ cat /tmp/platypus
Un                      ornitorrincos
Dos                     ornitorrincos
Tres                    ornitorrinco
[sergio@hibernia ~]$ fmt  /tmp/platypus
Un                      ornitorrincos Dos
ornitorrincos Tres                    ornitorrinco

Comando head

El comando head muestra de manera predeterminada las diez primeras líneas de un archivo

[sergio@hibernia ~]$ head /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/sh
daemon:x:2:2:daemon:/sbin:/bin/sh
adm:x:3:4:adm:/var/adm:/bin/sh
lp:x:4:7:lp:/var/spool/lpd:/bin/sh
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/bin/sh
news:x:9:13:news:/var/spool/news:/bin/sh

Comando Hexdump

hexdump se usa para mirar dentro de los archivos binarios. hexdump puede mostrar el contenido en muchas maneras diferentes.

Aquí hay una selección de tipear: hexdump -C /bin/bash

00096160 04 00 00 00 00 00 00 00 01 00 00 00 03 00 00 00 |................| 00096170 00 00 00 00 00 00 00 00 24 4c 09 00 db 00 00 00 |........$L......| 00096180 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 |................| 00096190 00 2e 73 68 73 74 72 74 61 62 00 2e 69 6e 74 65 |..shstrtab..inte| 000961a0 72 70 00 2e 6e 6f 74 65 2e 41 42 49 2d 74 61 67 |rp..note.ABI-tag| 000961b0 00 2e 68 61 73 68 00 2e 64 79 6e 73 79 6d 00 2e |..hash..dynsym..|

Cada carácter decimal representa 4 bits. Cada par representa un byte.

Las columnas son según se muestra a continuación:

  1. Una dirección de 32 bits. (8 hex, *4 bits / hex, = 32 bits)
  2. 8 bytes en esa dirección, de izquierda a derecha
  3. 8 bytes más
  4. los mismos 16 bytes, interpretados como una cadena

Comando join

Coteja dos archivos y los une donde los campos son iguales y muestra el resultado en la salida estándar.

[sergio@hibernia ~]$ cat  /tmp/file1 /tmp/file2
Animales        Continente
Ornitorrinco    Oceanía
Equidna         Oceanía
Emú             OCeanía
Avestruz        África
Animales        Clase
Ornitorrinco    Mamífero
Equidna         Mamífero
Emú             Pajarraco
Avestruz        Pajarraco
[sergio@hibernia ~]$ join /tmp/file1 /tmp/file2
Animales Continente Clase
Ornitorrinco Oceanía Mamífero
Equidna  Oceanía  Mamífero
Emú  OCeanía  Pajarraco
Avestruz África Pajarraco

Comando nl

El comando nl enumera las líneas de un archivo

root@hibernia sergio]# nl /etc/X11/lookupdm
     1  #!/bin/sh
     2  #---------------------------------------------------------------
     3  # Project         : Mandriva Linux
     4  # Module          : initscripts
     5  # File            : lookupdm
     6  # Version         : $Id: lookupdm,v 1.1 2005/05/30 02:59:33 flepied Exp $
     7  # Author          : Frederic Lepied
     8  # Created On      : Mon May 30 08:50:45 2005
     9  # Purpose         : Lookup the display manager according to the
    10  #                 argument or find the first available one.
    11  #---------------------------------------------------------------

    12  TARGET_DM=$1
    13  DIR=/etc/X11/dm.d

    14  if [ -n "$TARGET_DM" ]; then
    15      for f in `grep -l "^NAME=$TARGET_DM$" $DIR/*.conf`; do
    16          EXEC=
    17          eval `grep '^EXEC=' "$f"`
    18          if [ -x "$EXEC" ]; then
    19              echo $EXEC
    20              exit 0
    21          fi
    22      done
    23  fi

    24  for f in $DIR/*.conf; do
    25      EXEC=
    26      eval `grep '^EXEC=' "$f"`
    27      if [ -x "$EXEC" ]; then
    28          echo $EXEC
    29          exit 0
    30      fi
    31  done

    32  # lookupdm.sh ends here

Comando paste

El comando paste crear columnas verticales del contenido en los archivos de entrada especificados.

[root@hibernia /]# cat animales
Koala
Equidna
Emu
[root@hibernia /]# cat clases
mamífero
mamífero
pajarraco
[root@hibernia /]# paste animales clases
Koala   mamífero
Equidna mamífero
Emu     pajarraco

Comando pr

Toma los archivos de la entrada estándar y les da formato de impresión

[sergio@hibernia tmp]$ ls -lh  /bin/*  | pr

2006-07-28 17:58                                                Página 1

-rwxr-xr-x  1 root root 2,8K sep 20  2005 /bin/arch*
lrwxrwxrwx  1 root root   11 may 30 00:44 /bin/ash -> ../sbin/bsh*
lrwxrwxrwx  1 root root    4 may 30 00:43 /bin/awk -> gawk*
-rwxr-xr-x  1 root root  13K ago 18  2005 /bin/basename*
-rwxr-xr-x  1 root root 649K jun 12  2005 /bin/bash*
lrwxrwxrwx  1 root root    4 may 30 00:43 /bin/bash3 -> bash*
lrwxrwxrwx  1 root root   25 may 30 00:44 /bin/bluepin -> /etc/alternatives/bluepin*
lrwxrwxrwx  1 root root   11 may 30 00:44 /bin/bsh -> ../sbin/bsh*
-rwxr-xr-x  1 root root  16K ago 18  2005 /bin/cat*
-rwxr-xr-x  1 root root  34K ago 18  2005 /bin/chgrp*
-rwxr-xr-x  1 root root  34K ago 18  2005 /bin/chmod*
-rwxr-xr-x  1 root root  36K ago 18  2005 /bin/chown*
-rwxr-xr-x  1 root root  55K ago 18  2005 /bin/cp*
-rwxr-xr-x  1 root root 100K dic 23  2005 /bin/cpio*
lrwxrwxrwx  1 root root    4 may 30 00:43 /bin/csh -> tcsh*
-rwxr-xr-x  1 root root  27K ago 18  2005 /bin/cut*
-rwxr-xr-x  1 root root  79K feb 11  2005 /bin/dash*
-rwxr-xr-x  1 root root  45K ago 18  2005 /bin/date*
-rwxr-xr-x  1 root root  28K ago 18  2005 /bin/dd*
-rwxr-xr-x  1 root root  34K ago 18  2005 /bin/df*
-rwxr-xr-x  1 root root 4,4K sep 20  2005 /bin/dmesg*
lrwxrwxrwx  1 root root    8 may 30 00:43 /bin/dnsdomainname -> hostname*
-rwxr-xr-x  1 root root 2,7K may  3 13:12 /bin/doexec*
lrwxrwxrwx  1 root root    8 may 30 00:43 /bin/domainname -> hostname*
-rwxr-xr-x  1 root root  14K ago 18  2005 /bin/echo*
-rwxr-xr-x  1 root root   33 dic 22  2004 /bin/egrep*
-rwxr-xr-x  1 root root  13K ago 18  2005 /bin/env*
lrwxrwxrwx  1 root root   20 may 30 00:44 /bin/ex -> /etc/alternatives/ex*
-rwxr-xr-x  1 root root  22K ago 18  2005 /bin/expr*
-rwxr-xr-x  1 root root  12K ago 18  2005 /bin/false*
-rwxr-xr-x  1 root root 4,0K may  4 12:56 /bin/fbresolution*
-rwxr-xr-x  1 root root 873K may  4 12:56 /bin/fbtruetype.static*
-rwxr-xr-x  1 root root   33 dic 22  2004 /bin/fgrep*
-rwxr-xr-x  1 root root 131K ago  4  2005 /bin/find*
-rwxr-xr-x  1 root root 288K ene 10  2005 /bin/gawk*
-rwxr-xr-x  1 root root 288K ene 10  2005 /bin/gawk-3.1.4*
-rwxr-xr-x  1 root root 9,2K ago 12  2005 /bin/gettext*
-rwxr-xr-x  1 root root  71K dic 22  2004 /bin/grep*
lrwxrwxrwx  1 root root    3 jul  8 13:44 /bin/gtar -> tar*
-rwxr-xr-x  1 root root  50K may  8 16:48 /bin/gunzip*
-rwxr-xr-x  1 root root  50K may  8 16:48 /bin/gzip*
-rwxr-xr-x  1 root root 9,1K jul 24  2005 /bin/hostname*
-rwxr-xr-x  1 root root  16K ago 18  2005 /bin/id*
-rwxr-xr-x  1 root root 3,1K ene 10  2005 /bin/igawk*
-rwxr-xr-x  1 root root  27K may  3 13:12 /bin/ipcalc*
-rwxr-xr-x  1 root root  22K may 17  2004 /bin/ipv6calc*
-rwxr-xr-x  1 root root  158 jun 11 23:19 /bin/joys*
-rwxr-xr-x  1 root root 8,5K sep 20  2005 /bin/kill*
-rwxr-xr-x  1 root root 180K abr 29  2005 /bin/ksh*
-rwxr-xr-x  1 root root  12K ago 18  2005 /bin/link*
lrwxrwxrwx  1 root root   24 jul  9 02:08 /bin/linuxconf -> ../usr/bin/consolehelper*
-rwxr-xr-x  1 root root  23K ago 18  2005 /bin/ln*
-rwxr-xr-x  1 root root  20K sep 20  2005 /bin/login*
-rwxr-xr-x  1 root root  83K ago 18  2005 /bin/ls*
-rwxr-xr-x  1 root root 340K jul 31  2005 /bin/mail*
-rwxr-xr-x  1 root root  22K ago 18  2005 /bin/mkdir*







2006-07-28 17:58                                                Página 2


-rwxr-xr-x  1 root root  20K ago 18  2005 /bin/mknod*
-rwxr-xr-x  1 root root 6,7K feb 11  2005 /bin/mktemp*
-rwxr-xr-x  1 root root  30K sep 20  2005 /bin/more*
-rwsr-xr-x  1 root root 106K sep 20  2005 /bin/mount*
lrwxrwxrwx  1 root root   28 may 30 00:44 /bin/mount.cifs -> /etc/alternatives/mount.cifs*
-rwsr-xr-x  1 root root  18K jul  7 11:43 /bin/mount.cifs3*
-rwxr-xr-x  1 root root 4,7K ago 23  2005 /bin/mountpoint*
-rwxr-xr-x  1 root root  59K ago 18  2005 /bin/mv*
-rwxr-xr-x  1 root root  99K jul 24  2005 /bin/netstat*
-rwxr-xr-x  1 root root  15K ago 18  2005 /bin/nice*
lrwxrwxrwx  1 root root    8 may 30 00:43 /bin/nisdomainname -> hostname*
-rwxr-xr-x  1 root root 7,2K jul 11  2003 /bin/open*
lrwxrwxrwx  1 root root   16 may 30 00:44 /bin/pidof -> ../sbin/killall5*
-rwxr-xr-x  1 root root  31K may 17  2004 /bin/ping*
-rwxr-xr-x  1 root root  13K sep 17  2005 /bin/procps3-kill*
-rwxr-xr-x  1 root root 9,7K may  4 12:56 /bin/progress*
-rwxr-xr-x  1 root root  69K sep 17  2005 /bin/ps*
-rwxr-xr-x  1 root root  14K ago 18  2005 /bin/pwd*
lrwxrwxrwx  1 root root    4 may 30 00:43 /bin/rbash -> bash*
-rwxr-xr-x  1 root root  32K ago 18  2005 /bin/rm*
-rwxr-xr-x  1 root root  14K ago 18  2005 /bin/rmdir*
-rwxr-xr-x  1 rpm  rpm  5,1M jun 21 15:57 /bin/rpm*
lrwxrwxrwx  1 root root   21 may 30 00:44 /bin/rvi -> /etc/alternatives/rvi*
lrwxrwxrwx  1 root root   23 may 30 00:44 /bin/rview -> /etc/alternatives/rview*
lrwxrwxrwx  1 root root   22 may 30 00:44 /bin/rvim -> /etc/alternatives/rvim*
-rwxr-xr-x  1 root root  93K feb 19  2005 /bin/sed*
-rwxr-xr-x  1 root root  17K ene 25  2005 /bin/setserial*
-rwxr-xr-x  1 root root  41K dic 22  2004 /bin/sfxload*
lrwxrwxrwx  1 root root    4 may 30 00:43 /bin/sh -> bash*
-rwxr-xr-x  1 root root  14K ago 18  2005 /bin/sleep*
-rwxr-xr-x  1 root root  48K ago 18  2005 /bin/sort*
-rwxr-xr-x  1 root root  34K ago 18  2005 /bin/stat*
-rwxr-xr-x  1 root root  37K ago 18  2005 /bin/stty*
-rwsr-xr-x  1 root root  20K ago 18  2005 /bin/su*
-rwxr-xr-x  1 root root  12K ago 18  2005 /bin/sync*
-rwxr-xr-x  1 root root 194K feb 16 21:45 /bin/tar*
-rwxr-xr-x  1 root root 293K ago 25  2005 /bin/tcsh*
-rwxr-xr-x  1 root root  31K ago 18  2005 /bin/touch*
-rwxr-xr-x  1 root root  12K ago 18  2005 /bin/true*
-rwsr-xr-x  1 root root  59K sep 20  2005 /bin/umount*
lrwxrwxrwx  1 root root   29 may 30 00:44 /bin/umount.cifs -> /etc/alternatives/umount.cifs*
-rwsr-xr-x  1 root root 8,3K jul  7 11:43 /bin/umount.cifs3*
-rwxr-xr-x  1 root root  15K ago 18  2005 /bin/uname*
-rwxr-xr-x  1 root root  314 ago 22  2005 /bin/unicode_start*
-rwxr-xr-x  1 root root  12K ago 18  2005 /bin/unlink*
-rwxr-xr-x  1 root root  23K may  3 13:12 /bin/usleep*
lrwxrwxrwx  1 root root   20 may 30 00:44 /bin/vi -> /etc/alternatives/vi*
lrwxrwxrwx  1 root root   22 may 30 00:44 /bin/view -> /etc/alternatives/view*
lrwxrwxrwx  1 root root   21 may 30 00:44 /bin/vim -> /etc/alternatives/vim*
-rwxr-xr-x  1 root root 430K ago  5  2005 /bin/vim-minimal*
lrwxrwxrwx  1 root root    8 may 30 00:43 /bin/ypdomainname -> hostname*
-rwxr-xr-x  1 root root  50K may  8 16:48 /bin/zcat*


Comando sed

sed (stream editor) es un editor de textos usado, no interactivamente, sino en flujos. Esto permite transformar la salida del texto desde una tubería o de la línea de comandos.

sed soporta expresiones regulares que da un gran control sobre lo que se puede hacer al flujo de entrada. Las aplicaciones comunes de sed incluyen el análisis sintáctico de archivos de log, reemplazo de palabras y errores de tipeo en un flujo, y lectura de archivos CSV.

Puede usarse para borrar una línea determinada
sed 'NÚMERO_DE_LINEAd' archivo
Puede elegir un conjunto de líneas para borrar
sed 'NÚMERO_DE_LINEA_INICIAL,ÚMERO_DE_LINEA_FINALd' archivo
Puede borrar las líneas que coincidan con un patrón determinado por una expresión regular
sed '/patron/d' archivo
Puede reemplazar una cadena de texto por otra, cada vez que aparezca
sed 's/viejo/nuevo/g' archivo
O solo la primera vez que aparezca en cada línea
sed 's/viejo/nuevo/'
Puede añadir una línea después de cada línea del archivo
sed 'a\Línea insertada' archivo
Recuerdo de la salida
sed puede recordar partes de los patrones de entrada, y reemplazar esa sección en el archivo de salida. Esto se hace a través de los comandos $, | \(, \), \1-9.
Múltiples Substituciones
Normalmente, sed puede solamente hacer una substitución a la vez; sed 's/viejo1/nuevo1/g' 's/viejo2/nuevo2' no funcionará. Sin embargo, la opción -e permite múltiples comandos. Poner una "-e" antes de todos los comandos:
sed -e 's/viejo1/nuevo1/g' -e 's/viejo2/nuevo2/g'
Expresiones regulares

Las expresiones regulares permiten el reemplazo de patrones en lugar de cadenas. sed usa la sintaxis estándar de expresiones regulares [-]*^.

Por ejemplo sed -e 's/[0-9]*//g' borrará todos los números de la salida.

Carácter Descripción
^ comienzo de la línea
$ final de la línea
. un carácter cualquiera
* cero o más ocurrencias del carácter previo
[ ] todos los caracteres entre los corchetes

Ejemplos simples de reemplazo:

/./  	Apuntará a cualquier línea que contenga al menos un carácter
/../ 	Apuntará a cualquier línea que contenga al menos dos caracteres
/^#/ 	Apuntará a cualquier línea que comience con un '#'
/^$/ 	Apuntará a cualquier línea en blanco
/}^/ 	Apuntará a toda línea que termine con un '}' (sin espacios)
/} *^/ 	Apuntará a toda línea que termine con un '}' con cero o más espacios
/[abc]/ 	Apuntará a toda línea que contenga una 'a', 'b', o 'c' minúscula
/^[abc]/ 	Apuntará a cualquier línea que empiece con 'a', 'b', o 'c'

Clases de caracteres que se pueden encontrar:

[:alnum:]  	Alfanumérico [a-z A-Z 0-9]
[:alpha:] 	Alfabético [a-z A-Z]
[:blank:] 	Espacios o tabuladores
[:cntrl:] 	Cualquier carácter de control
[:digit:] 	Dígitos numéricos [0-9]
[:graph:] 	Cualquier carácter visible (no espacios en blanco)
[:lower:] 	Minúsculas [a-z]
[:print:] 	Caracteres que no sean de control
[:punct:] 	Caracteres de puntuación
[:space:] 	Espacio en blanco
[:upper:] 	Mayúsculas [A-Z]
[:xdigit:] 	Dígitos hexadecimales [0-9 a-f A-F]

Comando split

El comandom split parte un archivo en un grupo de archivo más pequeño.


[sergio@hibernia qemu-tmp]$ ls -lh
total 2,9M
-rw-r--r--  1 sergio sergio 2,9M jul 28 19:44 qemu-0.8.1-i386.tar.gz
[sergio@hibernia qemu-tmp]$ split -b 500k qemu-0.8.1-i386.tar.gz
[sergio@hibernia qemu-tmp]$ ls -lh
total 5,8M
-rw-r--r--  1 sergio sergio 2,9M jul 28 19:44 qemu-0.8.1-i386.tar.gz
-rw-r--r--  1 sergio sergio 500K jul 28 19:46 xaa
-rw-r--r--  1 sergio sergio 500K jul 28 19:46 xab
-rw-r--r--  1 sergio sergio 500K jul 28 19:46 xac
-rw-r--r--  1 sergio sergio 500K jul 28 19:46 xad
-rw-r--r--  1 sergio sergio 500K jul 28 19:46 xae
-rw-r--r--  1 sergio sergio 407K jul 28 19:46 xaf

Comando sort

El comando sort ordena las ĺíneas de un texto. Acepta un archivo o lista de archivos para ordenar, y si no se da ninguna o se le pasa '-', la lee de la salida estándar.

Ejemplo

[sergio@hibernia ~]$ rpm -qa | sort | head
a2ps-4.13b-8mdk
a320raid-3.00.047-4mdk
acpi-0.07-6mdk
acpid-1.0.4-6.2.20060mdk
alsa-utils-1.0.9-4mdk
amarok-1.4.1-0.5mdv2007.0
amarok-engine-xine-1.4.1-0.5mdv2007.0
amarok-scripts-1.4.1-0.5mdv2007.0
apmd-3.2.2-5mdk
apt-0.5.15cnc6-10mdk


Comando tac


tac hace lo mismo que cat, aunque muestra el contenido de archivos en orden inverso.

[root@hibernia /]# cat /etc/fstab
# This file is edited by fstab-sync - see 'man fstab-sync' for details
LABEL=/                 /                       ext3    defaults        1 1
none                    /dev/pts                devpts  gid=5,mode=620  0 0
none                    /dev/shm                tmpfs   defaults        0 0
LABEL=/main             /main                   ext3    defaults        1 2
none                    /proc                   proc    defaults        0 0
none                    /sys                    sysfs   defaults        0 0
/dev/hda5               swap                    swap    defaults        0 0
/dev/hdc                /media/cdrecorder       auto    pamconsole,fscontext=system_u:object_r:removable_t,exec,noauto,managed 0 0
/dev/fd0                /media/floppy           auto    pamconsole,fscontext=system_u:object_r:removable_t,exec,noauto,managed 0 0
[root@hibernia /]# tac /etc/fstab
/dev/fd0                /media/floppy           auto    pamconsole,fscontext=system_u:object_r:removable_t,exec,noauto,managed 0 0
/dev/hdc                /media/cdrecorder       auto    pamconsole,fscontext=system_u:object_r:removable_t,exec,noauto,managed 0 0
/dev/hda5               swap                    swap    defaults        0 0
none                    /sys                    sysfs   defaults        0 0
none                    /proc                   proc    defaults        0 0
LABEL=/main             /main                   ext3    defaults        1 2
none                    /dev/shm                tmpfs   defaults        0 0
none                    /dev/pts                devpts  gid=5,mode=620  0 0
LABEL=/                 /                       ext3    defaults        1 1
# This file is edited by fstab-sync - see 'man fstab-sync' for details


Comando tail

El comando tail muestra de manera predeterminada las últimas diez líneas de un archivo.

[root@hibernia /]# tail /var/log/messages
Jul 28 01:47:04 hibernia gpm: Interrupción de gpm succeeded
Jul 28 01:47:04 hibernia smartd[2185]: smartd received signal 15: Terminated
Jul 28 01:47:04 hibernia smartd[2185]: smartd is exiting (exit status 0)
Jul 28 01:47:04 hibernia smartd: Interrupción de smartd succeeded
Jul 28 01:47:04 hibernia acpid: Interrupción de acpid succeeded
Jul 28 01:47:04 hibernia crond: Interrupción de crond succeeded
Jul 28 01:47:04 hibernia irqbalance: Interrupción de irqbalance failed
Jul 28 01:47:05 hibernia kernel: Kernel logging (proc) stopped.
Jul 28 01:47:05 hibernia kernel: Kernel log daemon terminating.
Jul 28 01:47:06 hibernia exiting on signal 15


Comando tr

tr es un comando para traducir o borrar carácteres. Toma un flujo que ingresa de la entrada estándar y vuelca el flujo traducido sobre la salida estándar.

Consejos

Hay una manera para convertir un archivo con finales de líneas de DOS (CRLF) a finales de línea UNIX:

tr -d '\015' < $FILE.dos > $FILE.unix

Otro truco práctico es usar tr para comprimir múltiples caracteres en uno, lo cual a veces es práctico si se quiere usar cut para cortar cosas :


Esto convierte los múltiples espacios en uno.

[sergio@hibernia qemu-tmp]$ ls -l | tr -s ' '
total 5844
-rw-r--r-- 1 sergio sergio 2976584 jul 28 19:44 qemu-0.8.1-i386.tar.gz
-rw-r--r-- 1 sergio sergio 512000 jul 28 19:46 xaa
-rw-r--r-- 1 sergio sergio 512000 jul 28 19:46 xab
-rw-r--r-- 1 sergio sergio 512000 jul 28 19:46 xac
-rw-r--r-- 1 sergio sergio 512000 jul 28 19:46 xad
-rw-r--r-- 1 sergio sergio 512000 jul 28 19:46 xae
-rw-r--r-- 1 sergio sergio 416584 jul 28 19:46 xaf

Comando unexpand

El comando unexpand reemplaza los espacios en los archivos de texto creados con expand de vuelta a caracteres de tabulación.


Comando uniq

Uniq es un comando para borrar líneas duplicadas sucesivas de archivos.

Aunque parezca extraño, uniq toma los argumentos de entrada y de salida sin requerir redirección.

Entre las muchas opciones -c es útil por que cuenta cuantas duplicadas líneas hay. -i ignora la diferencia entre mayusculas y minúsculas.

[sergio@hibernia qemu-tmp]$ cat filecito
foo
foo
baz
bar
baz
Baz
[sergio@hibernia qemu-tmp]$  sort -f filecito | uniq -ci | sort -r
      3 baz
      2 foo
      1 bar


(Notar que para obtener la salida indiferente a mayúsculas y minúsculas y ordenana, sort tambien debe ser case-unsensitive, o sino tr o sed podría evitar el problema transformando las líneas, porque sort d otra manera ordenaría alfabéticamente 'Baz' antes de 'bar'. De hecho, si no hace falta contar y no se quieren otras opciones, sort -fu foorbarbaz eliminaría la necesidad de entubar a uniq totalmente.)

Las opciones -s, -f y -w dan más flexibilidad para ordenar líneas en columnas o ignorar los comienzos o finales de líneas.

Las opciones -d, -D, y -u controlan la salida.

Crear, monitorear y matar procesos

Procesos en en primer y segundo plano

Los comandos de manera predeterminada se ejecutan en primer plano, es decir toman control del prompt de la shell. ¿Pero eso es siempre conveniente?

Cuando se ejecuta manualmente el comando updatedb (y no a través del planificador de tareas) se puede observar que el proceso en general tarda bastante en terminar. Es natural: El comando updatedb actualiza una base de datos con la ruta de todos los archivos existentes en el sistema. Cuando un proceso ocupa durante mucho tiempo la terminal, se lo puede enviar a un segundo plano, para que el prompt sea liberado de manera que se puedan seguir ingresando comandos. Para lanzar directamente un proceso en segundo plano se agrega al final el carácter &.


[sergio@hibernia ~]$ sudo updatedb &
[1] 18718
[sergio@hibernia ~]$ ls
bin/       Documentos/  Facultad/  kbinarios               nohup.out        PicasaDocuments/  terminal.out  usr/
Descarga/  errores      File       Little_Debian-0.5b.iso  OperaDownloads/  saludo            tmp/          Vídeo/
Desktop/   example      Fotos/     Música/                 pepe             sbin              tuberias      vmware/
[sergio@hibernia ~]$ 

Como se puede ver por el ejemplo arriba citado luego de la ejecución del comando aparece un número entre corchetes y otro a la derecha del mismo. El primer número es el correspondiente al job, mientras que el segundo corresponde al PID (identificador de proceso).

jobs

El comando jobs da una lista de los jobs en background (segundo plano).

Ejemplo de uso

Al ejecutar algunos jobs en background:

 $ sleep 60 &
 [1] 13524
 $ sleep 60 &
 [2] 13534
 $ jobs
 [1]-  Running                 sleep 60 &
 [2]+  Running                 sleep 60 &

El comando jobs se puede usar para matar un trabajo o comenzar uno suspendido, como un proceso en primer plano.

  • kill %1
  • fg %1

Un proceso es un programa que un sistema multiprocesamiento de computadora está ejecutando. Otros sinónimos son los trabajos (jobs) y las tareas (tasks).

Generalmente, cada programa en ejecución es contenido en un proceso. Algunos programas más complejos dividen su trabajo en múltiples procesos, cada uno de los cuales contiene una pequeña parte del programa que realiza una tarea específica.

ps y top

El comando ps se usa para mostrar el listado de los procesos en los sistemas Linux. El comando top proporciona una lista que se actualiza continuamente con algo de información en la parte de arriba de la pantalla. La lista de todos los procesos con relaciones padre hijo se puede ver con pstree.

Ejemplo de comando ps
[sergio@hibernia ~]$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1   1568   496 ?        S    08:49   0:00 init [5]
root         2  0.0  0.0      0     0 ?        SN   08:49   0:00 [ksoftirqd/0]
root         3  0.0  0.0      0     0 ?        S<   08:49   0:00 [events/0]
root         4  0.0  0.0      0     0 ?        S<   08:49   0:00 [khelper]
root         5  0.0  0.0      0     0 ?        S<   08:49   0:00 [kthread]
root         7  0.0  0.0      0     0 ?        S<   08:49   0:00 [kacpid]
root        94  0.0  0.0      0     0 ?        S<   08:49   0:00 [kblockd/0]
root       124  0.0  0.0      0     0 ?        S    08:49   0:00 [pdflush]
root       125  0.0  0.0      0     0 ?        S    08:49   0:00 [pdflush]
root       127  0.0  0.0      0     0 ?        S<   08:49   0:00 [aio/0]
root       126  0.0  0.0      0     0 ?        S    08:49   0:01 [kswapd0]
root       716  0.0  0.0      0     0 ?        S    08:49   0:00 [kseriod]
root       794  0.0  0.0      0     0 ?        S    08:49   0:00 [kjournald]
root       920  0.0  0.0   1568   444 ?        S<s  08:49   0:00 udevd -d
root      1053  0.0  0.0      0     0 ?        S    08:49   0:00 [khubd]
root      1583  0.0  0.2  12116  1272 ?        S<s  08:50   0:00 ./hpiod
root      1620  0.0  0.0      0     0 ?        S    08:50   0:01 [kjournald]
root      1625  0.0  0.0      0     0 ?        S    08:50   0:00 [kjournald]
root      1627  0.0  0.5   8996  2872 ?        S<   08:50   0:00 python ./hpssd.py
root      1640  0.0  0.0      0     0 ?        S    08:50   0:00 [kjournald]
root      1645  0.0  0.0      0     0 ?        S    08:50   0:00 [kjournald]
root      3183  0.0  0.1   1588   528 ?        Ss   08:50   0:00 /sbin/ifplugd -b -i eth0
root      3233  0.0  0.1   1588   528 ?        Ss   08:50   0:00 /sbin/ifplugd -b -i eth1
root      4631  0.0  0.1   2096   912 ?        Ss   08:50   0:00 dhclient -1 -q -lf /var/lib/dhcp/dhclient-eth0.leases -pf /v
root      4870  0.0  0.1   1604   592 ?        Ss   08:50   0:00 syslogd -m 0
root      4882  0.0  0.2   2336  1332 ?        Ss   08:50   0:00 klogd -2
root      4935  0.0  0.1   1556   596 ?        Ss   08:50   0:00 /usr/sbin/acpid
xfs       5199  0.0  0.9   6956  4756 ?        Ss   08:50   0:10 xfs -port -1 -daemon -droppriv -user xfs
71        5224  0.0  0.2   2152  1004 ?        Ss   08:50   0:00 dbus-daemon --system
72        5249  0.0  1.0   6508  5044 ?        Ss   08:50   0:00 hald
root      5250  0.0  0.1   2740   948 ?        S    08:50   0:00 hald-runner
72        5256  0.0  0.1   1924   736 ?        S    08:50   0:00 /usr/lib/hald-addon-acpi
root      5275  0.0  0.1   1892   636 ?        S    08:50   0:01 /usr/lib/hald-addon-storage
root      5348  0.0  0.1   1852   656 ?        Ss   08:50   0:00 /usr/sbin/mandi -d
root      5457  0.0  0.2  20312  1444 ?        Ss   08:50   0:00 ./hpiod
root      5462  0.0  0.1   2640   728 ?        S    08:50   0:00 /usr/bin/kdm -nodaemon
root      5470  3.7  8.1  51600 39232 tty7     Ss+  08:50  21:35 /etc/X11/X -br -deferglyphs 16 :0 -auth /var/run/xauth/A:0-z
root      5472  0.0  1.2   9000  6124 ?        S    08:50   0:00 python ./hpssd.py
root      5506  0.0  0.3   3604  1828 ?        S    08:50   0:00 -:0
ntp       5526  0.0  0.7   3772  3772 ?        SLs  08:50   0:00 ntpd -A -u ntp:ntp
clamav    5626  0.0  0.2   4280  1212 ?        Ss   08:50   0:00 /usr/bin/freshclam --config-file=/etc/freshclam.conf --quiet
root      5651  0.0  0.1   1596   628 ?        Ss   08:50   0:00 crond
root      5737  0.0  0.0      0     0 ?        S    08:50   0:00 [kgameportd]
root      5799  0.0  0.2   2500   976 ?        Ss   08:50   0:00 login -- sergio
root      5800  0.0  0.0   1552   436 tty2     Ss+  08:50   0:00 /sbin/mingetty tty2
root      5803  0.0  0.0   1552   436 tty3     Ss+  08:50   0:00 /sbin/mingetty tty3
root      5806  0.0  0.0   1552   436 tty4     Ss+  08:50   0:00 /sbin/mingetty tty4
root      5809  0.0  0.0   1552   436 tty5     Ss+  08:50   0:00 /sbin/mingetty tty5
root      5812  0.0  0.0   1552   432 tty6     Ss+  08:50   0:00 /sbin/mingetty tty6
sergio    5915  0.0  0.3   3084  1472 ?        Ss   08:51   0:00 /bin/sh /usr/bin/startkde
sergio    5972  0.0  0.2   3916  1060 ?        Ss   08:51   0:00 ssh-agent
sergio    5992  0.0  0.1   2316   828 ?        Ss   08:51   0:00 gpg-agent --daemon
sergio    6074  0.0  0.1   2624   756 ?        S    08:51   0:00 /usr/bin/dbus-launch --exit-with-session --auto-syntax
sergio    6075  0.0  0.1   2048   736 ?        Ss   08:51   0:00 dbus-daemon --fork --print-pid 8 --print-address 6 --session
sergio    6089  0.0  3.2  22500 15776 ?        S    08:51   0:06 /usr/bin/perl /usr/bin/net_applet
sergio    6124  0.0  0.1   2696   960 ?        Ss   08:51   0:00 gpg-agent --daemon
sergio    6151  0.0  1.9  24592  9532 ?        Ss   08:51   0:00 kdeinit Running...
sergio    6155  0.0  1.8  23848  8988 ?        S    08:51   0:03 dcopserver [kdeinit] --nosid
sergio    6157  0.0  2.2  26628 10696 ?        S    08:51   0:00 klauncher [kdeinit] --new-startup
sergio    6159  0.0  3.8  34092 18580 ?        S    08:51   0:27 kded [kdeinit] --new-startup
sergio    6161  0.0  0.3   2728  1592 ?        S    08:51   0:05 /usr/lib/gam_server
sergio    6167  0.0  0.0   1548   336 ?        S    08:51   0:00 kwrapper ksmserver
sergio    6169  0.0  2.4  25748 11932 ?        S    08:51   0:00 ksmserver [kdeinit]
sergio    6170  0.0  3.1  29100 14980 ?        S    08:51   0:18 kwin [kdeinit]
sergio    6172  0.0  3.6  36108 17568 ?        S    08:51   0:16 kdesktop [kdeinit]
sergio    6198  0.2  3.7  33268 18256 ?        S    08:51   1:43 kicker [kdeinit]
sergio    6216  0.0  2.1  25132 10308 ?        S    08:51   0:00 kio_file [kdeinit] file /home/sergio/tmp/ksocket-sergio/klau
sergio    6224  0.0  2.3  25812 11596 ?        S    08:51   0:02 kaccess [kdeinit]
sergio    6233  0.0  3.0  32756 14516 ?        S    08:51   0:03 knotify [kdeinit]
sergio    6234  0.0  0.1   2416   732 ?        S    08:51   0:00 xsettings-kde
sergio    6237  0.0  2.0  25808  9768 ?        S    08:51   0:00 kalarmd --autostart
sergio    6238  0.0  3.0  28412 14684 ?        S    08:51   0:00 korgac --miniicon korganizer
sergio    6240  0.0  3.3  28876 16172 ?        S    08:51   0:00 kmix [kdeinit] -caption KMix -icon kmix.png -miniicon kmix.p
sergio    6242  0.0  4.4  39240 21416 ?        S    08:51   0:09 basket
sergio    6244  0.4  9.8 109088 47732 ?        Sl   08:51   2:24 kontact
sergio    6266  0.0  2.4  25196 11952 ?        S    08:52   0:00 kwalletmanager --kwalletd
sergio    6268  0.0  3.0  55836 14628 ?        S    08:52   0:21 kio_pop3 [kdeinit] pop3s /home/sergio/tmp/ksocket-sergio/kla
sergio    6489  0.0  2.1  25760 10496 ?        S    08:54   0:00 kttsd
sergio    6815  0.0  0.2   3092  1024 ?        S    08:56   0:00 /bin/sh /usr/bin/mozilla-firefox http://www.kde-apps.org/con
sergio    6821  0.0  0.2   3132  1000 ?        S    08:56   0:00 /bin/sh /usr/lib/mozilla-firefox-1.5.0.4/run-mozilla.sh /usr
sergio    6826 14.7 23.9 302200 115484 ?       Sl   08:56  85:01 /usr/lib/mozilla-firefox-1.5.0.4/mozilla-firefox-bin
sergio    6833  0.0  0.6   4904  3036 ?        S    08:56   0:00 /usr/lib/gconfd-2 17
sergio    7447  0.0  2.9  27992 14112 ?        R    09:25   0:09 yakuake
sergio    7472  0.0  0.3   3336  1488 pts/1    Ss   09:25   0:00 /bin/bash
sergio    7711  0.0  0.2   3332  1400 tty1     Ss+  09:31   0:00 -bash
root      8866  0.0  0.6   6644  3336 ?        Ss   10:24   0:01 cupsd
sergio    9765  0.0  2.7  15492 13284 ?        S    11:08   0:00 aspell -a -S -C -d es
sergio   11804  2.9  6.0  68372 29408 ?        Sl   12:48  10:08 /home/sergio/Descarga/binarios/Last.fm-1.1.4/player
root     11909  0.0  0.2   2100  1004 ?        Ss   12:51   0:00 dhclient eth0
sergio   13068  0.0  3.2  29080 15696 ?        S    13:43   0:06 kthesaurus [kdeinit]
sergio   13980  0.0  2.6  53896 12940 ?        Sl   14:28   0:03 kio_pop3 [kdeinit] pop3s /home/sergio/tmp/ksocket-sergio/kla
sergio   16047  0.0  0.5   5384  2728 ?        Ss   16:03   0:00 /usr/lib/bonobo-activation-server --ac-activate --ior-output
sergio   16049  0.0  0.6   8720  3292 ?        Sl   16:03   0:00 /usr/lib/gnome-vfs-daemon --oaf-activate-iid=OAFIID:GNOME_VF
sergio   19210  0.0  2.2  52736 11064 ?        S    18:28   0:00 kio_pop3 [kdeinit] pop3 /home/sergio/tmp/ksocket-sergio/klau
sergio   19238  0.0  2.3  52756 11216 ?        S    18:30   0:00 kio_http [kdeinit] http /home/sergio/tmp/ksocket-sergio/klau
sergio   19255  0.3  2.3  52760 11212 ?        S    18:31   0:00 kio_http [kdeinit] http /home/sergio/tmp/ksocket-sergio/klau
sergio   19256  0.3  2.3  52760 11212 ?        S    18:31   0:00 kio_http [kdeinit] http /home/sergio/tmp/ksocket-sergio/klau
sergio   19271  0.0  0.1   2628   876 pts/1    R+   18:31   0:00 ps aux
Ejemplo de comando top
top - 18:34:04 up  9:44,  2 users,  load average: 0.54, 0.61, 0.69
Tasks: 101 total,   1 running, 100 sleeping,   0 stopped,   0 zombie
Cpu(s):  9.7% us,  1.7% sy,  0.0% ni, 88.3% id,  0.3% wa,  0.0% hi,  0.0% si
Mem:    483168k total,   477444k used,     5724k free,    28724k buffers
Swap:   506004k total,    31272k used,   474732k free,    90060k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 5470 root      15   0 98.6m  38m 3476 S  4.3  8.1  21:52.32 X
11804 sergio    15   0 68660  28m 6708 S  3.3  6.1  10:13.05 player
19299 sergio    15   0 30076  15m  12m S  1.3  3.3   0:01.37 konsole
 6244 sergio    15   0  106m  46m  26m S  0.7  9.9   2:24.81 kontact
 6826 sergio    15   0  299m 116m  21m S  0.7 24.7  85:18.93 mozilla-firefox
 1620 root      15   0     0    0    0 S  0.3  0.0   0:01.55 kjournald
 7447 sergio    16   0 28128  13m  12m S  0.3  2.9   0:09.62 yakuake
19373 sergio    16   0  1996 1044  808 R  0.3  0.2   0:00.07 top
    1 root      16   0  1568  496  456 S  0.0  0.1   0:00.86 init
    2 root      34  19     0    0    0 S  0.0  0.0   0:00.01 ksoftirqd/0
    3 root      10  -5     0    0    0 S  0.0  0.0   0:00.61 events/0
    4 root      10  -5     0    0    0 S  0.0  0.0   0:00.02 khelper
    5 root      16  -5     0    0    0 S  0.0  0.0   0:00.00 kthread
    7 root      20  -5     0    0    0 S  0.0  0.0   0:00.00 kacpid
   94 root      10  -5     0    0    0 S  0.0  0.0   0:00.59 kblockd/0
  124 root      15   0     0    0    0 S  0.0  0.0   0:00.02 pdflush
  125 root      15   0     0    0    0 S  0.0  0.0   0:00.29 pdflush
  127 root      17  -5     0    0    0 S  0.0  0.0   0:00.00 aio/0
  126 root      15   0     0    0    0 S  0.0  0.0   0:01.26 kswapd0
  716 root      15   0     0    0    0 S  0.0  0.0   0:00.00 kseriod
  794 root      15   0     0    0    0 S  0.0  0.0   0:00.42 kjournald
  920 root      12  -4  1568  444  420 S  0.0  0.1   0:00.15 udevd
 1053 root      15   0     0    0    0 S  0.0  0.0   0:00.00 khubd
 1583 root      13  -2 12116 1272 1188 S  0.0  0.3   0:00.00 hpiod
 1625 root      15   0     0    0    0 S  0.0  0.0   0:00.01 kjournald
 1627 root      13  -2  8996 2872 2556 S  0.0  0.6   0:00.31 python
 1640 root      15   0     0    0    0 S  0.0  0.0   0:00.01 kjournald       

La llamada del sistema fork() se usa para crear nuevos procesos. Cuando se hace esto, el nuevo proceso es un hijo del viejo proceso, el cual es el padre. Si el padre sale, se mata al hijo. Un proceso daemon se regenera para ser un hijo de init, así, aun si el (primer) padre sale, el daemon continúa ejecutándose.

Envío de señales de terminación a procesos

Matar un proceso significa forzarlo a salir inmediatamente.

Es siempre mejor salir de una aplicación apropiadamente, tal como seleccionar Salir de un menú. Ctrl-C o Ctrl-D usualmente quitará una aplicación de una terminal, y Archivo-Salir o cerrar la ventana harña lo mismo en el sistema de ventanas Xorg. Usando el comando 'kill -TERM pid' (TERM es la predeterminada, y no es estrictamente necesaria) le dirá al proceso determinado que termine.

La aplicación puede rehusar todo esto (pero debería tener una muy buena razón si elige hacerlo, en cuyo caso se puede usar 'kill -KILL PID' (o -9) para terminarlo por la fuerza. El proceso no tendrá otra posibilidad.

Sin embargo, ciertas llamadas del sistema no se pueden interrumpir. Si una aplicación es atrapada en una de estas, el programa no se puede matar. Esto sucede muy raramente, e indica un bug serio o un mal funcionamiento del sistema (tal como cuando se trata con recursos de NFS ininterrumpibles). La única esperanza es esperar un rato para ver si finaliza o reiniciar.

Un proceso puede también estar muerto, lo que significa que su padre aun no le ha notificado que está muerto. Si se encuentra un proceso en ese estado, se puede esperar o intentar matar a su padre en su lugar. Tales procesos se llaman zombie.

El comando killall mata los procesos por nombre, aliviando la necesidad de ejecutar ps o encontrar el PID antes de ingresar un comando kill. Señales distintas a kill se pueden enviar también.


Ejemplo

$ killall mozilla-bin

Prioridades de ejecución de los procesos

Linux permite la aplicación de atributos conocidos como prioridades que controlan cuanto tiempo se le da a un cierto programa en proporción a otros.

La prioridad de un proceso es mantenida por el planificador y es el resultado de un número de factores - cuanto duerme el proceso voluntariamente, cuanto del tiempo de la CPU ha estado usándose en los recientes milisegundos, etc. Uno de los factores se llama el valor de niceness (cortesía o buenos modales).

Los usuarios pueden influir las prioridades por medio de la herramienta nice, una herramienta que informa o define el valor de niceness de una aplicación determinada, el cual es un entero entre -20 a +19. Se llama "nice" ("cortés") porque el número que se da a un proceso determina cuan dispuesta una tarea está a hacerse a un lado y dejar que otras tareas monopolicen el procesador.

El valor de niceness sirve para incrementar o reducir la prioridad de un proceso determinado, después de que todo los demás ha sido calculado. El valor predeterminado de niceness es 0, valores más altos bajan la prioridad y los más bajos la incrementan.

La cantidad de tiempo de CPU dado a cada proceso depende de su prioridad relativa a otros procesos en el sistema (excepto que un proceso puede deliberadamente dormir antes de que su propia porción de CPU se termine, dando camino al próximo proceso).

De manera que si se incrementa el valor de niceness, éste disminuye su prioridad y hace que el proceso tome menos tiempo de CPU.

nice se usa para configurar el valor de niceness para un proceso cuando un comando se corre primero. Por ejemplo,

nice -n 19 updatedb

ejecutaría updatedb con le menor prioridad posible. Para cambiar el valor de niceness de un proceso actualmente en ejecución, se usa renice.

Se requieren privilegios para ejecutar un comando con niceness negativo, o para bajar la niceness de un comando en ejecución.

Archivos de texto y expresiones regulares

Las expresiones regulares, también conocidas como "patrones" o simplemente como "regex" constituyen una notación que describe grupos de cadenas de texto. Se usan en muchas áreas de un entorno Linux.

Características

Las expresiones regulares definen un patrón. Cualquier cadena de texto puede entonces comprobar su coincidencia con ese patrón. Más allá de su sintaxis, las siguientes características están en todos los motores de expresiones regulares usados ampliamente:

  • La capacidad para coincidir con cualquier conjunto de subexpresiones dadas, e.g. "coincidir con Tom o Dick o Harry"
    • La capacidad para coincidir con cualquier grupo de caracteres, e.g. "coincidir con cualquiera de a, e, i, o y u"
    • Dentro de tal grupo, la capacidad para incluir rangos de caracteres, e.g. "coincidir con cualquiera de los caracteres desde a hasta f inclusive"
    • La capacidad para invertir aquellos grupos de manera que solamente los caracteres no incluidos puedan coincidir, e.g. "coincidir con cualquier otro carácter diferente de z"
    • La capacidad para coincidir con cualquier carácter que no es una nueva línea (o menos frecuentemente, con cualquier carácter en absoluto; algunas sintaxis permiten ambas cosas)
    • La capacidad para coincidir con cualquier carácter en cualquier clase de caracteres, y clases invertidas de cada clase
      • Una clase consiste de letras
      • Una clase de caracteres consistente en dígitos
      • Una clase de caracteres consistente de espacios en blanco (espacios, tabulaciones, saltos de líneas, etc)
      • Una clase de caracteres consistente de "caracteres de palabras" (usualmente letras, números y el guión bajo)
  • La capacidad para coincidir una cierta subexpresión un número variable de veces, e.g. "coincidir con Tom al menos dos veces" o "coincidir Dick entre tres y siete veces"
    • La capacidad para hacer que una subexpresión dada coincida opcionalmente
    • La capacidad para hacer que una subexpresión dada coincida cero o más veces
    • La capacidad para hacer que una subexpresión dad coincida una o más veces
  • La capacidad para almacenar una subexpresión y que coincida de nuevo más tarde, e.g. "coincidir con Tom o Dick seguido de Harry seguido por quien coincidió originalmente"
  • la capacidad para hacer "cero" coincidencias; agregando estas a una expresión regular que coincida en un grupo x que filtrará las cadenas de texto en un grupo y, siendo y un subconjunto (posiblemente conteniendo la totalidad) de x, pero que no cambiará (excepto posiblemente por filtrar) las porciones que coincidan de cualquiera de estas cadenas de texto.
    • la capacidad para hacer estas coincidencias al comienzo o fin de una cadena
    • La capacidad para hacer que estas coincidencias al comienzo o al final de una línea
    • La capacidad para hacer que estas coincidencias en los límites entre un "palabra" y un carácter "no-palabra"

sed y grep son comandos que generalmente se los usa con expresiones regulares.

Ejemplo 1: Coincidencia con el comienzo de línea

[sergio@hibernia ~]$ grep ^p /etc/passwd
prueba:x:502:502::/home/prueba:/bin/bash

Ejemplo 2: Coincidencia con el fin de línea

[sergio@hibernia ~]$ grep "sh$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/sh
daemon:x:2:2:daemon:/sbin:/bin/sh
adm:x:3:4:adm:/var/adm:/bin/sh
lp:x:4:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:12:mail:/var/spool/mail:/bin/sh
news:x:9:13:news:/var/spool/news:/bin/sh
uucp:x:10:14:uucp:/var/spool/uucp:/bin/sh
operator:x:11:0:operator:/var:/bin/sh
games:x:12:100:games:/usr/games:/bin/sh
nobody:x:65534:65534:Nobody:/:/bin/sh
clamav:x:75:75:system user for clamav:/var/lib/clamav:/bin/sh
sergio:x:500:500:sergio:/home/sergio:/bin/bash
burrufini:x:501:501:burrufini:/home/burrufini:/bin/dash
prueba:x:502:502::/home/prueba:/bin/bash
gornis:x:503:503::/home/gornis:/bin/bash
silvana:x:504:504::/home/silvana:/bin/bash
tirso:x:506:507::/home/tirso:/bin/bash

Ejemplo 3: Trabajando con sed


 $ sed 's/<.*>//g' basket.html 

Este ejemplo puede servir para borrar etiquetas HTML. El "." en una expresión regular que significa un único carácter, mientras que el "*" quiere decir que el carácter a la izquierda puede aparecer cero o más veces.

Edición de archivos de texto

El editor vi

vi es un editor de texto originalmente escrito por Bill Joy. Tiene tres modos de trabajo, modo comando, modo edición y modo ex. Cuando se inicia el programa, se abre en modo comando donde cualquier cosa que se tipea se trata como un comando. Mucha genten encuentra difícil vi de usar, pero una versión de vi se puede encontrar en todos los sistemas Unix y estilo Unix, incluyendo Linux, y su existencvia está asegurada en el estándar POSIX. Es por lo tanto útil saber algo de comandos básicos.

Comandos

Dado que vi es un editor modal, uno tiene que cambiar de modos para ingresar un comando. Si bien es cierto que esto puede sonar tedioso al principio, cuando uno va aprediendo a usarlo más, esto se convierte en algo completamente natural. El modo comando se ingresa al presionar la tecla de escape, e ingresando i o una a hace entrar al usuario al modo inservión. Los comandos pueden con frecuencia tener un prefijo numérico para representar la repetición de ese comando por ese número (por ejemplo, dd borra una línea,3dd borra tres). Comandos de marcas y de moviemiento se pueden usar para operar sobre grandes porciones de texto. Los comandos del modo ex van precedidos por dos puntos (:).


Comandos básicos

Algunos de los comandos más comunes y sus significados:

i - entra al modo edición

a - entra al modo edición moviendo una columna a la derecha el punto de inserción

o - entra al modo edición insertando una fila por debajo

O - entra al modo edición insertando una fila por encima

x - borrar

:w - guardar (grabar)

:wq - guardar (grabar) y salir


Otros comandos útiles

ZZ - otra manera de guardar y salir

:q! - sale sin guardar el archivo

:w - guarda el archivo (notar que agregando q guardará y luego saldrá)

:w! file2 - sobreescribe el archivo file2

:w ruta/nombre_del_archivo - guarda el archivo del sobre el que se está trabajando en la ruta especificada

/algún_texto - busca desde tu posición actual hacia adelante hasta "algún_texto"

presionando / de nuevo buscará lo último que se haya querido encontrar

Para buscar para atrás, usar ? en lugar de /

Navegación

Vi también tiene algunas maneras prácticas de moverse a través de un documento. En modo comando, las letras h,j,k,l moverán el cursor hacia la izquierda, abajo, arriba, derecha respectivamente. 0 (cero) se moverá hasta al comienzo de la línea y $ se moverá hasta el fin de la línea.

Sí, se pueden usar también las teclas de flechas.

H - Se mueve hasta la primera línea de la pantalla.

L - Se mueve hasta la última línea de la pantalla.

G - Se mueve hasta la última línea del documento.


Borrado

d^ - Borra desde la posición actual hasta el comienxo de la línea

d$ - Borra desde el comienzo de la posición actual hasta el fin de la línea

dw - Borra desde la posición actual hasta el fin de la palabra

3dd - Borra 3 líneas desde la posición actual hacia abajo


Deshacer

u - Deshace los últimos cambios


Copiado

y^ - Copia desde la posición actual hasta el comienzo de la línea

y$ - Copia desde la posición actual hata el fin de la línea

yw - Copia desde la posición actual hasta el fin de la palabra

3yy - Copia 3 líneas hacia abajo desde la posición actual.


Pegado

p - Pega después del cursor

P - Pega antes del cursor

np - Pega texto n veces

Ejecutar comandos del sistema

:! - Ejecuta comandos en la shell sin salir del programa

Edición avanzada

:e archivo2 - Permite editar archivo2 y luego volver al archivo original

:e! - Deshace todos los cambios que no hayan sido guardados

Ejercicios

Redireccionamiento
  • Necesitamos tener en un archivo de texto, la cantidad de archivos que contienen los directorios: ~/.config/ , ~/.fontconfig/ y /etc/init.d/ . Se debe indicar con cada número el directorio al que pertenecen. No debe haber más información que la requerida.
Tuberías
  • Mostrar por pantalla los archivos del directorio /usr/bin/ que empiecen y terminen con "g".
  • Mostrar por la salida estándar las líneas que refieren a las unidades de disco del comando dmesg
sed
  • Mostrar solo las líneas del archivo /etc/apt/sources.list que no estén comentadas.
  • Guardar el siguiente texto en un archivo y procesarlo de manera que los cortes de línea se transformen en un retorno de carro.
Muerte de Antoñito el camborio

Por Federico García Lorca

Voces de muerte sonaron <br> cerca del Guadalquivir. <br> Voces antiguas que cercan <br> voz de clavel varonil.<br>
Les clavó sobre las botas <br> mordiscos de jabalí.<br> En la lucha daba saltos <br> jabonados de delfín.<br> Bañó
con sangre enemiga <br> su corbata carmesí,<br> pero eran cuatro puñales <br> y tuvo que sucumbir. <br> Cuando las
estrellas clavan <br> rejones al agua gris, <br> cuando los erales sueñan <br> verónicas de alhelí,<br> voces de
muerte sonaron <br> cerca del Guadalquivir. <br> -Antonio Torres Heredia,<br> Camborio de dura crin, <br> moreno de
verde luna, <br> voz de clavel varonil:<br> ¿Quién te ha quitado la vida <br> cerca del Guadalquivir?<br> -Mis cuatro
primos Heredias, <br> hijos de Benamejí.<br> Lo que en otros no envidiaban, <br> ya lo envidiaban en mí. <br> Zapatos
color corinto, <br> medallones de marfil,<br> y este cutis amasado<br> con aceituna y jazmín.<br> -¡Ay, Antoñito el
Camborio, <br> digno de una Emperatriz! <br> Acuérdate de la Virgen <br> porque te vas a morir. <br> -¡Ay, Federico
García,<br> llama a la Guardia Civil!<br> Ya mi talle se ha quebrado <br> como caña de maíz.<br> Tres golpes de
sangre tuvo<br> y se murió de perfil.<br> Viva moneda que nunca<br> se volverá a repetir.<br> Un ángel marchoso
pone<br> su cabeza en un cojín.<br> Otros de rubor cansados<br> encendieron un candil.<br> Y cuando los cuatros
primos<br> llegan a Benamejí,<br> voces de muerte cesaron<br>
cerca del Guadalquivir.<br> 
  • Borrar las primeras 4 líneas del archivo anterior mediante sed.

Bibliografía

http://wiki.linuxquestions.org/wiki/

http://unix.t-a-y-l-o-r.com/VRfiles.html

http://www.gentoo.org/doc/es/articles/l-sed1.xml

http://www.gentoo.org/doc/es/articles/l-sed2.xml

http://www.gentoo.org/doc/es/articles/l-sed3.xml

Herramientas personales