Todos los geek de Linux deben saber Sed y Awk. Este es el por qué…

Dos de las utilidades de Linux más infravaloradas criminalmente son las realmente arcanas Sed y Awk. Pero, ¿qué son? ¿Cómo se usan? ¿Y cómo hacen que sea más fácil procesar el texto?

Dos de las utilidades de Linux más infravaloradas criminalmente son las realmente arcanas Sed y Awk.  Pero, ¿qué son?  ¿Cómo se usan?  ¿Y cómo hacen que sea más fácil procesar el texto?
Anuncio

Dos de las utilidades de Linux más infravaloradas criminalmente son Sed y Awk. Aunque es cierto que pueden parecer un poco arcanas, si alguna vez tiene que hacer cambios repetitivos en grandes trozos de código o texto, o si alguna vez tiene que analizar un poco de texto, Sed y Awk son invaluables.

Entonces, ¿qué son? ¿Cómo se usan? ¿Y cómo, cuando se combinan juntos, hacen que sea más fácil procesar el texto?

¿Qué es Sed?

Sed fue desarrollado en 1971 en Bell Labs, por el legendario pionero de la informática Lee E. McMahon.

El nombre significa editor de flujo, y eso es lo que hace. Le permite editar cuerpos o secuencias de texto mediante programación, a través de un lenguaje de programación compacto y simple, pero completo.

La forma en que funciona es simple: lee texto, línea por línea, en un búfer. Para cada línea, llevará a cabo las instrucciones predefinidas, cuando corresponda.

Por ejemplo, si alguien escribiera un guión de Sed que reemplazara la palabra "cerveza" por "refresco", y luego lo pasara en un archivo de texto que contuviera toda la letra de "99 Botellas de cerveza en la pared", iría a través de ese archivo línea por línea, e imprime "99 botellas de refresco en la pared", y así sucesivamente.

La secuencia de comandos de Sed más básica es Hello World. Aquí, utilizamos la utilidad Unix Echo, que simplemente emite cadenas, para imprimir "Hello World". Pero conectamos esto con Sed y le decimos que reemplace "Mundo" con "Dave". Explicaciones por sí mismo.

 echo "Hola mundo" | sed s / world / Dave 

sedawk-dave

También puede combinar las instrucciones de Sed en archivos, si necesita hacer una edición más complicada. Inspirado por este hilarante hilo de Reddit, voy a tomar la letra de A-Ha's Take On Me, y reemplazaré cada instancia de "I", "Me" y "My", con Greg.

Primero, pondré la letra de la canción en un archivo de texto llamado tom.txt . Luego, abriré mi editor de texto preferido (mi favorito es Vim. Las 7 razones principales para dar al editor de texto Vim Una oportunidad Las 7 razones principales para dar al editor de texto Vim una oportunidad Por años, he intentado con un editor de texto después Otro. Lo que sea, lo probé. Utilicé a todos y cada uno de estos editores durante más de dos meses como mi principal editor diario. De alguna manera, yo ... Leer más, pero Nano nano vs. vim: Terminal Editores de texto comparados nano vs. vim: editores de texto de terminal comparados Aunque Linux se ha vuelto bastante fácil de usar para prácticamente cualquier persona sin tener que usar el terminal, algunos de nosotros lo usamos regularmente o tenemos curiosidad sobre cómo se puede controlar. Leer más y Gedit gedit: uno de los editores de texto sin formato más completos [Linux y Windows] gedit: uno de los editores de texto sin formato más completos [Linux y Windows] Cuando piensas en editores de texto sin formato, lo primero que puede aparecer en su cabeza es la aplicación de Bloc de notas de Windows. Hace exactamente lo que dice su descripción del trabajo - características simples para un texto sin formato ... Leer más son dos opciones excelentes) y agregue las siguientes líneas. Asegúrese de que el archivo que cree finalice con .sed.

sed-greg-sed

Puede notar que en el ejemplo anterior, me he repetido (por ejemplo, s / me / Greg / y s / Me / Greg /). Esto se debe a que algunas versiones de Sed, como la que se envía con Mac OS X, no admiten coincidencias que no distingan entre mayúsculas y minúsculas. Como resultado, tenemos que escribir dos instrucciones de Sed para cada palabra, por lo que reconoce la versión en mayúscula y no capitalizada.

Esto no funcionará perfectamente, como si hubiera reemplazado cada instancia de "I", "Me" y "My" a mano. Recuerde, solo estamos usando esto como ejercicio para demostrar cómo puede agrupar instrucciones de Sed en una secuencia de comandos y luego ejecutarlas con un solo comando.

Entonces, necesitamos invocar el archivo. Para hacer eso, ejecutamos este comando.

 cat tom.txt | sed -f greg.sed 

Detengámonos y veamos qué hace esto. Los lectores con ojos de águila se habrán dado cuenta de que no estamos usando Echo aquí. Estamos usando Cat. Esto se debe a que mientras Cat imprima todo el contenido del archivo, echo solo imprimirá el nombre del archivo. También habrás notado que estamos ejecutando Sed con la bandera "-f". Esto le dice que abra el script como un archivo.

El resultado final es esto.

sed-greg-script

También vale la pena señalar que Sed admite expresiones regulares (REGEX). Estos le permiten definir patrones en texto, usando una sintaxis especial y complicada.

Aquí hay un ejemplo de cómo eso podría funcionar. Vamos a tomar las letras de las canciones antes mencionadas, pero use expresiones regulares para imprimir cada línea que no comienza con "Tomar".

 cat tom.txt | sed / ^ Take / d 

sed-regex-take

Sed es, por supuesto, increíblemente útil. Pero es aún más poderoso cuando se combina con Awk.

¿Qué es Awk?

Awk, como Sed, es un lenguaje de programación diseñado para manejar grandes cantidades de texto. Pero mientras que Sed se usa para procesar y modificar texto, Awk se usa principalmente como una herramienta para el análisis y la generación de informes .

Al igual que Sed, Awk se desarrolló por primera vez en los Bell Labs en la década de 1970. Su nombre no proviene de lo que hace el programa, sino de los apellidos de cada uno de los autores: Alfred Aho, Peter Weinberger y Brian Kernaghan.

Awk funciona leyendo un archivo de texto o secuencia de entrada una línea a la vez. Cada línea se escanea para ver si coincide con un patrón predefinido. Si se encuentra una coincidencia, se realiza una acción.

Pero aunque Sed y Awk pueden compartir propósitos similares, son dos idiomas completamente diferentes, con dos filosofías de diseño completamente diferentes. Awk se asemeja más a algunos lenguajes de uso general Cómo elegir un lenguaje de programación para aprender hoy y obtener un gran trabajo en 2 años Cómo elegir un idioma de programación para aprender hoy y obtener un gran trabajo en 2 años Puede tomar años de trabajo dedicado a convertirse en un programador realmente bueno; Entonces, ¿hay alguna manera de elegir el idioma correcto para comenzar a partir de hoy, para ser contratado mañana? Lea más, como C, Python y Bash. Tiene cosas como funciones, y un enfoque más parecido a C para cosas como iteración y variables (James Bruce explicó cómo funciona la iteración Lo básico absoluto de la programación para principiantes (Parte 2) Lo básico absoluto de la programación para principiantes (Parte 2) En parte 2 de nuestra guía de principiantes absoluta para la programación, voy a cubrir los conceptos básicos de funciones, valores de retorno, bucles y condicionales. Asegúrese de haber leído la parte 1 antes de abordar esto, donde le expliqué ... Leer más). En pocas palabras, se siente más como un lenguaje de programación.

Entonces, probemos. Usando las letras para Take On Me, vamos a imprimir todas las líneas que tienen más de 20 caracteres.

 awk 'length ($ 0)> 80' tom.txt awk-length

El siguiente ejemplo que he descifrado desvergonzadamente de la documentación oficial de Awk. Pero es un gran ejemplo del potencial de este lenguaje poderoso pero pequeño. También es una gran demostración de cómo funcionan cosas como la iteración y las variables. Primero, cree un archivo llamado "WordCount.awk" y agregue las siguientes líneas.

 {for (i = 1; i <= NF; i ++) freq [$ i] ++} 
 END {for (palabra en frecuencia) printf "% s \ t% d \ n", palabra, frecuencia [palabra]} 

Guárdelo y luego ejecútelo con el siguiente comando.

 awk -f WordCount.awk tom.txt 

awk-wordcount
Genial, ¿verdad? Probablemente notarás que no están en ningún tipo de orden. Puede ordenar los resultados usando la utilidad de ordenamiento Unix. Pero lo dejaremos por otro día. Vamos a mantenerlo simple.

Combinando los dos

Awk y Sed son increíblemente poderosos cuando se combinan. Puedes hacer esto usando tubos Unix. Esos son los bits "|" entre los comandos.

Probemos esto: Vamos a enumerar todas las líneas en Take On Me que tienen más de 20 caracteres, usando Awk. Luego, vamos a quitar todas las líneas que comienzan con "Tomar" . Juntos, todo se ve así:

 awk 'length ($ 0)> 20' tom.txt | sed / ^ Take / d 

Y produce esto:

awk-length-sed

Ahora volteemos eso. Comenzaremos por eliminar todas las líneas que comiencen con Take, y luego conectarlas a Awk, donde contaremos cuántas veces aparece cada palabra. Se parece un poco a esto:

 cat tom.txt | sed / ^ Take / d | awk -f WordCount.awk 

awk-wordcount-sed

El poder de Sed y Awk

Hay mucho que puedes explicar en un solo artículo. Pero espero haber ilustrado cuán inmensamente poderosos son Sed y Awk. En pocas palabras, son una fuente de procesamiento de texto.

¿Así que, por que deberías preocuparte? Bueno, además del hecho de que nunca sabes cuándo necesitas hacer cambios predecibles y repetitivos en un documento de texto, Sed y Awk son geniales para analizar archivos de registro. Esto es especialmente útil cuando intenta depurar un problema en su servidor LAMP firmado para el alojamiento web solo SSH. No se preocupe: instale fácilmente cualquier software web firmado para alojamiento web solo SSH. No te preocupes: instala fácilmente cualquier software web. ¿No sabes lo primero sobre operar Linux a través de su poderosa línea de comandos? No te preocupes más Lea más, o mire sus registros de acceso para ver si su servidor ha sido pirateado.

¿Has encontrado un uso interesante para Sed y Awk? ¿Hay alguna otra utilidad de Linux que te parezca poco apreciada? Déjame saber en los comentarios a continuación, y chatearemos.

In this article