Comandos Unix y GNU
De XTech Capacitacion
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

