LPIC

Guía extraoficial de estudio

Archivos en la Categoría: 4: Uso de flujos, canalizaciones y redireccionamientos

Bifurcaciones y paso de múltiples argumentos a comandos

Bifurcaciones

tee: este comando se encarga de dividir la entrada estándar para que se muestre en la salida estándar y en tantos ficheros como se desee. Esto es útil cuando no solo se quieren enviar datos hacia una tuberia, sino también guardar una cópia en un archivo. Si este no existe, lo crea, y si existe lo sobrescribirá, siempre y cuando no usemos el flag -a.

Supongamos que queremos ver el contenido de un archivo por pantalla y a su vez guardar el contenido en un fichero:

cat fichero.txt | tee contenido.txt

Generar líneas de comandos

xargs: este comando se utiliza para pasar un gran número de argumentos a otros comandos. En la siguiente instrucción queremos borrar todos los ficheros que terminen en .py de nuestro directorio home:

find ~/ -name *.py | xargs rm

Si a su vez quisiéramos guardar un archivo .log con todos los ficheros que hemos eliminado:

find ~/ -name “*.l” | tee ficheros_borrados.log | xargs rm
Anuncios

Pipes

Empecemos traduciendo la palabra al español:  pipe –> tubería.  Tener claro esto va a ser fundamental para entender su funcionamiento.

Las pipes o pipelines se representan mediante la barra vertical ( | ). Se utilizan para redireccionar la salida estándar de un programa a la entrada estándar de otro. La mejor forma para comprenderlas es viendo un ejemplo.

Supongamos que necesitamos extraer un determinado dato de un fichero. El fichero passwd, situado en /etc, contiene datos sobre los usuarios y grupos definidos del sistema. Ejecutamos cat /etc/passwd para ver su estructura:

at:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/bash
avahi:x:105:107:User for Avahi:/var/run/avahi-daemon:/bin/false
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:Daemon:/sbin:/bin/bash
dnsmasq:x:104:65534:dnsmasq:/var/lib/empty:/bin/false
ftp:x:40:49:FTP account:/srv/ftp:/bin/bash
games:x:12:100:Games account:/var/games:/bin/bash
lp:x:4:7:Printing daemon:/var/spool/lpd:/bin/bash
mail:x:8:12:Mailer daemon:/var/spool/clientmqueue:/bin/false
man:x:13:62:Manual pages viewer:/var/cache/man:/bin/bash
messagebus:x:101:103:User for D-Bus:/var/run/dbus:/bin/false
mysql:x:60:106:MySQL database admin:/var/lib/mysql:/bin/false
news:x:9:13:News system:/etc/news:/bin/bash
nobody:x:65534:65533:nobody:/var/lib/nobody:/bin/bash
ntp:x:74:102:NTP daemon:/var/lib/ntp:/bin/false
postfix:x:51:51:Postfix Daemon:/var/spool/postfix:/bin/false
pulse:x:106:108:PulseAudio daemon:/var/lib/pulseaudio:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
rtkit:x:103:105:RealtimeKit:/proc:/bin/false
sshd:x:100:101:SSH daemon:/var/lib/sshd:/bin/false
statd:x:102:65534:NFS statd daemon:/var/lib/nfs:/sbin/nologin
uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
wwwrun:x:30:8:WWW daemon apache:/var/lib/wwwrun:/bin/false
super:x:1000:100:super:/home/super:/bin/bash
usbmux:x:107:65534:usbmuxd daemon:/var/lib/usbmuxd:/sbin/nologin

Queremos saber si el usuario “super” existe en el sistema, y si es así, que Uid  tiene. Dado que la magnitud de este fichero puede ser muy grande, descartamos la búsqueda “a ojo” y haríamos lo siguiente:

cat /etc/passwd | grep ^super | cut -f3 -d”:”

Hemos usado dos pipes, por lo tanto podemos diferenciar tres bloques:

  • cat /etc/passwd: muestra el contenido del fichero.
  • grep ^super: de las lineas mostradas por el comando anterior, busca la que empiece por “super”.
  • cut -f3 -d”:” : corta el campo 3 de la linea, teniendo en cuenta que delimitamos los campos con “:”

Más adelante veremos mejor el funcionamiento del comando grep y cut, lo que nos debe quedar claro ahora es como hemos entrelazado tres comandos distintos para obtener un resultado, que en este caso será “1000”.

Las pipes pueden tener una longitud arbitraria:

comando uno |comando dos | comando tres […..]

Otro ejemplo interesante podría ser.

grep /bin/bash /etc/passwd | wc -l

En este caso, nos devuelve el número de usuarios que tengan definida la shell bash.