El Shell Bash de GNU/Linux 2 – Tuberías y filtros

El Shell Bash de GNU/Linux 2 – Tuberías y filtros

En el artículo anterior “El Shell Bash de GNU/Linux 1” explicábamos como funciona el Shell, en este veremos los comandos que podemos usar en nuestras tuberías en el Shell.

  1. El Shell Bash de GNU/Linux 1 – Introducción
  2. El Shell Bash de GNU/Linux 2 – Tuberías y filtros
  3. El Shell Bash de GNU/Linux 3 – Variables de entorno
  4. El Shell Bash de GNU/Linux 4 – Expresiones regulares
  5. El Shell Bash de GNU/Linux 5 – Sistema de ficheros
  6. El Shell Bash de GNU/Linux 5.1 – El árbol de directorios estándar
  7. El Shell Bash de GNU/Linux 5.2 – Tipos de ficheros
  8. El Shell Bash de GNU/Linux 5.3 – nombres, rutas absolutas y relativas
  9. El Shell Bash de GNU/Linux 5.4 – Permisos
  10. El Shell Bash de GNU/Linux 5.5 – Listar ficheros
  11. El Shell Bash de GNU/Linux 5.6 – Comandos para trabajas con archivos y carpetas
  12. El Shell Bash de GNU/Linux 5.7 – Otros comandos útiles
  13. El Shell Bash de GNU/Linux 5.8 – Montaje de sistemas de ficheros

2. Tuberías y filtros

Es posible introducir en una misma línea dos o más comandos separados por el carácter tubería o pipe (|), conectando la salida estándar de un comando con la entrada estándar de otro. Podemos conectar más de dos órdenes. El uso más habitual es filtrar datos utilizando comandos que vamos a ir viendo, y que pueden actuar tanto como comandos como filtros.

orden1 | orden2

De esta forma, puedes ejecutar un comando, y su salida puede ser la entrada para otro, que a su vez puede servir de entrada a un tercero:

comando1 | comando2 | comando3,

Ocurrirá que la salida proporcionada por el comando1 se tomará como entrada para el comando2. La salida del comando2 es tomada como entrada para el comando3.

Ejemplos:

1) Averigua todos los procesos del usuario ubuntu

sudo ps aux|grep ubuntu

2) ¿cuantos son?

sudo ps aux|grep ubuntu|wc -l

Los filtros en Unix/Linux se utilizan igual que en Windows, mediante el carácter tubería para filtrar la información.

Estos filtros son: more, less, … que introducimos aquí y que tenéis también en el punto 2.8

more

Muestra el contenido de un archivo paginando la salida por pantalla. Su sintaxis es:

more fichero1 ….

  • Pulsando <Enter> aparece una nueva línea.
  • Pulsando barra espaciadora aparece una nueva pantalla.
  • Pulsando q finalizamos la visualización.

Ejemplos: Lo podemos usar como comando o como filtro en una tubería:

more /etc/bash.bashrc
cat /etc/bash.bashrc | more

ls | more

less

Muestra el contenido de un archivo paginando la salida por pantalla y permitiendo moverse tanto hacia al final del fichero como hacia el principio. Su sintaxis es:

less fichero1 ….

  • Pulsando <Enter> aparece una nueva línea.
  • Pulsando barra espaciadora aparece una nueva pantalla.
  • Pulsando q finalizamos la visualización.

Ejemplo:

less /etc/bash.bashrc
cat /etc/bash.bashrc | less

ls | less

tail

Visualiza el final de un fichero, por defecto visualiza las diez últimas líneas. Su sintaxis es:

tail [opciones] [fichero]

Opciones:

-cN muestra los últimos N bytes

-nN muestra las últimas N líneas en lugar de 10 . Si el primer carácter de N es un +, muestra el fichero a partir de esa línea, equivale a quitar lineas por encima.

Ejemplos:

tail –10c fich

Obtiene los 10 últimos caracteres de fich.

ls | tail

Obtiene las 10 últimas líneas del listado obtenido mediante la orden ls.

tail -n+2 /etc/bash.bashrc

Quita la primera línea del fichero /etc/bash.bashrc

head

Obtiene en la salida estándar las primeras líneas de un fichero, por defecto las 10 primeras líneas. Su sintaxis es:

head [-n] [fichero(s)]

Donde:

-nN obtiene las n primeras líneas. Si el primer carácter de N es un , equivale a quitar N lineas por debajo.

Ejemplo:

ls | head

Obtiene las 10 primeras líneas del listado obtenido mediante la orden ls.

cat -n /etc/bash.bashrc|head -n-2

Quita las 2 últimas líneas del fichero /etc/bash.bashrc

wc

Cuenta el número de caracteres, palabras y líneas de uno o más fichero(s), incluye espacios en blanco y caracteres de salto de línea.

Cuando se indica el nombre de más de un fichero wc proporciona los contadores individuales y su totalidad y se presentan los de cada fichero etiquetados con su nombre.

Si no se especifica ningún fichero, leerá de la entrada estándar. Su sintaxis es:

wc [opciones] [fichero(s)]

Donde las opciones pueden ser:

  • -c visualiza sólo el número de caracteres del fichero.
  • -l visualiza sólo el número de líneas del fichero.
  • -w visualiza sólo el número de palabras del fichero.

Ejemplos:

cat fichero|wc -l

Cuenta las líneas de fichero.

ls -l /etc | grep ^-|wc -l

Cuenta el número de archivos de un directorio.

ls -l /etc | grep ^d|wc -l

Cuenta el número de directorios de un directorio.

ls -la|wc -l

Cuenta las lineas del listado completo de ficheros.

ps aux|grep ubuntu|wc -l

Cuenta los procesos del usuario ubuntu.

tr

Traduce, comprime y borra caracteres de la entrada estándar, escribiendo el resultado en la salida estándar.

tr [opciones] conjunto1 [conjunto2]

Opciones:

  • -c opera sobre el complemento (sobre cada carácter que no coincida)
  • -d borra caracteres de conjunto1, no traduce
  • -s remplaza cada sucesión de entrada de un carácter repetido del conjunto1 por una sola aparición de dicho carácter → muy útil para convertir varios espacios en uno solo.

Su uso más habitual es procesar una salida antes de pasársela a cut para extraer columnas, por ejemplo para sustituir todos los espacios en blanco consecutivos por uno solo.

Ejemplos:

ls -l|grep ^d|tr -s ” “|cut -f8 -d” “

Listado largo -l, donde filtro sólo los directorios ^d, traduzco todos los espacios en blanco consecutivos en uno solo, y corto el campo 8 que en mi caso (en la distribución que utilizo) coincide en ls -l, con el nombre de archivo o directorio.

Podemos usar -d para borrar caracteres, combinado con -c para borrar lo que no coincida (el complemento):

cat vocales.txt | tr -dc [aeiou] → borro todo lo que no sean vocales

Su uso más habitual es procesar una salida antes de pasársela a cut para extraer columnas, por ejemplo para sustituir todos los espacios en blanco consecutivos por uno solo, en salidas de comandos ls, ps, etc.

ps aux|tr -s ” “|cut -f11 -d” “

Extrae la columna 11 correspondiente al ejecutable del proceso.

Compararlo con este otro:

ps aux|cut -f11 -d” “

Pero también permite traducir caracteres, incluidos especiales como la tabulación \t.

ls -l|tail -n+2|tr -s ” ” “\t”

  • Con tail quito la primera línea (el resumen que saca ls -l)
  • Con tr sustituyo los espacios por tabuladores.

cut

Se usa para cortar columnas en ficheros y pasar a la salida estándar las columnas o campos de la entrada estándar o del archivo especificado. Su sintaxis es:

cut [opciones] lista [fichero(s)]

Donde las opciones pueden ser:

  • -c corta caracteres.
  • -f corta campos.
  • -d especifica el carácter de separación entre los distintos campos (delimitador). Por defecto el separador de campos es <TAB>
  • lista especifica que columnas se van a cortar. Estas se identifican por su número a partir del 1 y caben las siguientes posibilidades:

Ejemplo: ¿Qué Shell utiliza el usuario Ubuntu?

cat /etc/passwd | grep ubuntu | cut -f7 -d:

grep

Es un filtro que permite buscar cadenas de caracteres (patrón) en los archivos que se le indica y muestra la línea del fichero que contiene el patrón. Su sintaxis:

grep [opciones] patrón [fichero(s)]

Donde las opciones pueden ser:

  • -c visualiza el nº total de líneas donde se localiza el patrón.
  • -i elimina la diferencia entre mayúsculas y minúsculas.
  • -l visualiza sólo el nombre de los ficheros donde se localiza el patrón.
  • -n visualiza el nº de línea donde aparece el patrón, así como la línea completa.
  • -v visualiza las líneas del fichero donde no aparece el patrón.
  • -w obliga a que patrón coincida solamente con palabras completas
  • -x obliga a que patrón coincida solamente con líneas completas

Ejemplos: Se utiliza más como filtro con tuberías que como comando:

cat /etc/passwd|grep -w jblanco

Saca solo la linea de mi usuario. O bien:

cat /etc/passwd|grep jblanco

Igualmente también saca solo la linea de mi usuario → utiliza cadena como patrón

ps aux|grep ubuntu|wc -l

Cuenta los procesos del usuario ubuntu

→ Lo mejor de este comando es que admite “Expresiones Regulares” → Ver apartado 4 Expresiones regulares.

Un ejemplo: Mostrar sólo los directorios que empiecen por un número

ls -ld [0-9]*|grep “^d”

En este caso la ER es ^d el gorro indica comienzo de linea y la d corresponde al tipo de archivo “directorio” cuando hacemos un listado largo con ls -l. Otro más:

ls -ld [A-Z]*|grep “^d”

Directorios que comiencen por letra mayúscula → utiliza una expresión regular.

Otro ejemplo algo más rebuscado:

Mostrar del fichero /etc/login.defs solo los valores establecidos, es decir, los que no llevan almohadilla delante, # → comentario

cat /etc/login.defs|grep -v “^#”|sort -u

sort

Se utiliza para ordenar líneas de un fichero o un flujo, puede usarse como comando o como filtro.

Puede ordenar alfabética o numéricamente, teniendo en cuenta que cada línea del fichero es un registro compuesto por varios campos, los cuales están separados por un carácter denominado separador de campo (tabulador, espacio en blanco, dos puntos…). Su sintaxis es:

sort [opciones] [fichero/s]

Donde las opciones más interesantes son:

  • -f ignora mayúsculas y minúsculas.
  • -n ordena campos numéricos por valor no por caracteres.
  • -r orden inverso.
  • -u suprime líneas repetidas en el fichero de salida
  • -t indica el delimitador de campos, por defecto el espacio en blanco.
  • -kN indica el campo por el que ordenar (hasta el final)
  • -kN,M indica el campo por el que ordenar (hasta el campo M)
  • -kN,N indica que ordene sólo por el campo N (N=M)
  • ficheros nombres de los ficheros a ordenar.

Ejemplos:

ps aux|cut -f1 -d” “|sort|uniq

Averiguar los usuarios que están ejecutando procesos en el sistema

  • ps aux → lista todos los procesos de todos los usuarios
  • cut -f1 -d” ” → el flujo recibido se separa en campos usando como delimitador “ “ espacio en blanco, y nos quedamos con el primer campo -f1
  • Por último con sort se ordena y con uniq se deja solo uno de los repetidos.

Es equivalente a: ps aux|cut -f1 -d” “|sort -u

ls -l|grep ^-|sort -k5n

Lista solo ficheros y los ordena de forma numérica por la quinta columna, que en mi distro es el tamaño.

  • ls -l → Lista
  • grep ^- → filtra sólo los ficheros, que comienzan por –
  • -k5 → ordeno por el quinto campo/columna
  • -n → de forma numérica

sort -k3 -nt”:” /etc/passwd

Ordena de forma numérica por el tercer campo (UID) el fichero de usuarios que tiene como separador :

uniq

Descarta todas las líneas sucesivas idénticas, menos una de ENTRADA (o entrada estándar), escribiendo en SALIDA (o en la salida estándar). Se suele usar en combinación de sort.

Un ejemplo típico es averiguar los usuarios que están ejecutando procesos:

ps axu|cut -f1 -d” “|sort|uniq

Opciones:

  • c precede a las líneas con el número de ocurrencias
  • d muestra sólo las líneas duplicadas
  • u muestra sólo las líneas que son únicas

En el siguiente capítulo “3. Variables de entorno del Shell” veremos que son y como utilizar variables. Espero que os resulte interesante, hasta entonces!

  1. El Shell Bash de GNU/Linux 1 – Introducción
  2. El Shell Bash de GNU/Linux 2 – Tuberías y filtros
  3. El Shell Bash de GNU/Linux 3 – Variables de entorno
  4. El Shell Bash de GNU/Linux 4 – Expresiones regulares
  5. El Shell Bash de GNU/Linux 5 – Sistema de ficheros
  6. El Shell Bash de GNU/Linux 5.1 – El árbol de directorios estándar
  7. El Shell Bash de GNU/Linux 5.2 – Tipos de ficheros
  8. El Shell Bash de GNU/Linux 5.3 – nombres, rutas absolutas y relativas
  9. El Shell Bash de GNU/Linux 5.4 – Permisos
  10. El Shell Bash de GNU/Linux 5.5 – Listar ficheros
  11. El Shell Bash de GNU/Linux 5.6 – Comandos para trabajas con archivos y carpetas
  12. El Shell Bash de GNU/Linux 5.7 – Otros comandos útiles
  13. El Shell Bash de GNU/Linux 5.8 – Montaje de sistemas de ficheros

13 comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.