Unix / Linux: tuberías y filtros

En este capítulo, discutiremos en detalle sobre tuberías y filtros en Unix. Puede conectar dos comandos juntos para que la salida de un programa se convierta en la entrada del siguiente programa. Dos o más comandos conectados de esta manera forman una tubería.

Para hacer una tubería, coloque una barra vertical (|) en la línea de comando entre dos comandos.

Cuando un programa toma su entrada de otro programa, realiza alguna operación en esa entrada y escribe el resultado en la salida estándar. Se lo conoce comofilter.

El comando grep

El comando grep busca en un archivo o archivos líneas que tengan un patrón determinado. La sintaxis es -

$grep pattern file(s)

El nombre "grep" viene del comando ed (un editor de línea de Unix) g/re/p que significa "buscar globalmente una expresión regular e imprimir todas las líneas que la contienen".

Una expresión regular es un texto sin formato (una palabra, por ejemplo) y / o caracteres especiales utilizados para la coincidencia de patrones.

El uso más simple de grep es buscar un patrón que consta de una sola palabra. Se puede usar en una tubería para que solo las líneas de los archivos de entrada que contienen una cadena determinada se envíen a la salida estándar. Si no le da a grep un nombre de archivo para leer, leerá su entrada estándar; así es como funcionan todos los programas de filtrado:

$ls -l | grep "Aug"
-rw-rw-rw-   1 john  doc     11008 Aug  6 14:10 ch02
-rw-rw-rw-   1 john  doc      8515 Aug  6 15:30 ch07
-rw-rw-r--   1 john  doc      2488 Aug 15 10:51 intro
-rw-rw-r--   1 carol doc      1605 Aug 23 07:35 macros
$

Hay varias opciones que puede utilizar junto con el grep comando -

No Señor. Opción y descripción
1

-v

Imprime todas las líneas que no coinciden con el patrón.

2

-n

Imprime la línea coincidente y su número de línea.

3

-l

Imprime solo los nombres de los archivos con líneas coincidentes (letra "l")

4

-c

Imprime solo el recuento de líneas coincidentes.

5

-i

Coincide con mayúsculas o minúsculas.

Usemos ahora una expresión regular que le dice a grep que busque líneas con "carol", seguido de cero u otros caracteres abreviados en una expresión regular como ". *"), seguido de "Ago" .−

Aquí, estamos usando el -i opción para tener una búsqueda que no distinga entre mayúsculas y minúsculas -

$ls -l | grep -i "carol.*aug"
-rw-rw-r--   1 carol doc      1605 Aug 23 07:35 macros
$

El comando sort

los sortEl comando organiza las líneas de texto alfabéticamente o numéricamente. El siguiente ejemplo ordena las líneas en el archivo de alimentos:

$sort food
Afghani Cuisine
Bangkok Wok
Big Apple Deli
Isle of Java

Mandalay
Sushi and Sashimi
Sweet Tooth
Tio Pepe's Peppers
$

los sortEl comando organiza las líneas de texto alfabéticamente de forma predeterminada. Hay muchas opciones que controlan la clasificación:

No Señor. Descripción
1

-n

Ordena numéricamente (ejemplo: 10 se ordenará después de 2), ignora los espacios en blanco y las pestañas.

2

-r

Invierte el orden de clasificación.

3

-f

Ordena mayúsculas y minúsculas juntas.

4

+x

Ignora primero x campos al ordenar.

Se pueden vincular más de dos comandos en una tubería. Tomando un ejemplo de tubería anterior usandogrep, podemos ordenar los archivos modificados en agosto por orden de tamaño.

La siguiente tubería consta de los comandos ls, grepy sort -

$ls -l | grep "Aug" | sort +4n
-rw-rw-r--  1 carol doc      1605 Aug 23 07:35 macros
-rw-rw-r--  1 john  doc      2488 Aug 15 10:51 intro
-rw-rw-rw-  1 john  doc      8515 Aug  6 15:30 ch07
-rw-rw-rw-  1 john  doc     11008 Aug  6 14:10 ch02
$

Esta tubería clasifica todos los archivos de su directorio modificados en agosto por orden de tamaño y los imprime en la pantalla del terminal. La opción de clasificación + 4n omite cuatro campos (los campos están separados por espacios en blanco) y luego clasifica las líneas en orden numérico.

Los comandos pg y más

Normalmente, puede comprimir una salida larga en la pantalla, pero si pasa más texto o usa el pgcomando como filtro; la pantalla se detiene una vez que la pantalla está llena de texto.

Supongamos que tiene una lista de directorios larga. Para facilitar la lectura de la lista ordenada, canalice la salida a través demore como sigue -

$ls -l | grep "Aug" | sort +4n | more
-rw-rw-r--  1 carol doc      1605 Aug 23 07:35 macros
-rw-rw-r--  1 john  doc      2488 Aug 15 10:51 intro
-rw-rw-rw-  1 john  doc      8515 Aug  6 15:30 ch07
-rw-rw-r--  1 john  doc     14827 Aug  9 12:40 ch03
	.
	.
	.
-rw-rw-rw-  1 john  doc     16867 Aug  6 15:56 ch05
--More--(74%)

La pantalla se llenará una vez que esté llena de texto que consta de líneas ordenadas según el tamaño del archivo. En la parte inferior de la pantalla está elmore indicador, donde puede escribir un comando para moverse por el texto ordenado.

Una vez que haya terminado con esta pantalla, puede usar cualquiera de los comandos enumerados en la discusión del programa más.