Anuncio
Dos de las utilidades de Linux menos apreciadas criminalmente son Sed y Awk. Aunque es cierto que pueden parecer un poco arcanos, si alguna vez tiene que hacer cambios repetitivos en grandes fragmentos de código o texto, o si alguna vez tiene que analizar algún texto, Sed y Awk son invaluables.
Entonces, ¿qué son? ¿Cómo se usan? ¿Y cómo, cuando se combinan, hacen que sea más fácil procesar el texto?
¿Qué es el sed?
Sed fue desarrollado en 1971 en Laboratorios Bell, 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. programáticamente, a través de un lenguaje de programación compacto y simple, pero completo de Turing
La forma en que funciona es simple: lee texto, línea por línea en un búfer. Para cada línea, realizará las instrucciones predefinidas, cuando corresponda.
Por ejemplo, si alguien escribiera un guión Sed que reemplazara la palabra "cerveza" por "refresco", y luego pasara un archivo de texto que contenía todo letra de "99 Botellas de cerveza en la pared", revisaría ese archivo línea por línea e imprimiría "99 Botellas de refresco en la pared", y así en.
El script Sed más básico es Hello World. Aquí, utilizamos la utilidad Unix Echo, que simplemente genera cadenas, para imprimir "Hello World". Pero le enviamos esto a Sed y le decimos que reemplace "Mundo" con "Dave". Cosas auto explicativas.
echo "Hola mundo" | sed s / mundo / Dave

También puede combinar instrucciones Sed en archivos, si necesita hacer una edición más complicada. Inspirado por este hilarante hilo de Reddit, Voy a llevar la letra a A-Ha's Tomar en míy reemplace 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 darle una oportunidad al editor de texto VimDurante años, probé un editor de texto tras 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 ... Lee mas , pero Nano nano vs. vim: Editores de texto de terminal comparadosAunque 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 ... Lee mas y Gedit gedit: uno de los editores de texto sin formato con más funciones [Linux y Windows]Cuando piensa en editores de texto plano, lo primero que puede aparecer en su cabeza es la aplicación Bloc de notas de Windows. Hace exactamente lo que dice su descripción de trabajo: características simples para un texto plano ... Lee mas son dos excelentes opciones) y agregue las siguientes líneas. Asegúrese de que el archivo que cree termine con .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 incluye con Mac OS X, funcionan no admite coincidencia entre mayúsculas y minúsculas. Como resultado, tenemos que escribir dos instrucciones Sed para cada palabra, por lo que reconoce la versión en mayúscula y no en mayúscula.
Esto no funcionará perfectamente, como si hubiera reemplazado cada instancia de "I", "Yo" y "Mi" a mano. Recuerde, solo estamos usando esto como un ejercicio para demostrar cómo puede agrupar las instrucciones de Sed en un script y luego ejecutarlas con un solo comando.
Entonces, necesitamos invocar el archivo. Para hacer eso, ejecutamos este comando.
gato tom.txt | sed -f greg.sed
Reduzcamos la velocidad y veamos qué hace esto. Los lectores con ojos de águila habrán notado que somos no usando Echo aquí. Estamos usando Cat. Esto se debe a que mientras Cat imprimirá todo el contenido del archivo, echo solo imprimirá el nombre del archivo. También habrá notado que estamos ejecutando Sed con la bandera "-f". Esto le dice que abra el script como un archivo.
El resultado final es este.

También vale la pena señalar que Sed admite expresiones regulares (REGEX). Estos le permiten definir patrones en el texto, utilizando una sintaxis especial y complicada.
Aquí hay un ejemplo de cómo podría funcionar. Vamos a tomar las letras de las canciones antes mencionadas, pero use expresiones regulares para imprimir cada línea que no Comience con "Take".
gato tom.txt | sed / ^ Take / d

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 cuerpos de texto. Pero mientras Sed se usa para procesar y modificar texto, Awk se usa principalmente como una herramienta para análisis y informes.
Al igual que Sed, Awk se desarrolló por primera vez en Bell Labs en la década de 1970. Su nombre no proviene de lo que el programa hace, sino más bien los apellidos de cada uno de los autores: Alfred Aho, Peter Weinberger y Brian Kernaghan.
Awk funciona leyendo un archivo de texto o una secuencia de entrada línea por línea. 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 si bien Sed y Awk pueden compartir propósitos similares, son dos idiomas completamente diferentes, con dos filosofías de diseño completamente diferentes. Awk se parece más a algunos lenguajes de uso general Cómo elegir un lenguaje de programación para aprender hoy y conseguir un excelente trabajo en 2 añosPuede llevar años de trabajo dedicado convertirse en un programador verdaderamente bueno; Entonces, ¿hay una manera de elegir el idioma correcto para comenzar hoy, para ser contratado mañana? Lee mas , como C, Python y Bash. Tiene cosas como funciones y un enfoque más similar a C para cosas como iteración y variables (James Bruce explicó cómo funciona la iteración Los fundamentos absolutos de la programación para principiantes (Parte 2)En la parte 2 de nuestra guía absoluta de programación para principiantes, cubriré los conceptos básicos de funciones, valores de retorno, bucles y condicionales. Asegúrate de haber leído la parte 1 antes de abordar esto, donde expliqué el ... Lee mas ). En pocas palabras, se siente más como un lenguaje de programación.
Entonces, probémoslo. Usando la letra de Take On Me, vamos a imprimir todas las líneas que tengan más de 20 caracteres.
awk 'length ($ 0)> 80' tom.txt
El siguiente ejemplo que tengo descaradamente cuna 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.
{para (i = 1; i <= NF; i ++) freq [$ i] ++ }
END {para (palabra en frecuencia) printf "% s \ t% d \ n", palabra, frecuencia [palabra] }
Guárdelo y ejecútelo con el siguiente comando.
awk -f WordCount.awk tom.txt
¿Guay, verdad? Probablemente notará que no están en ningún tipo de orden. usted lata ordenar los resultados utilizando la utilidad de ordenación Unix. Pero lo dejaremos para otro día. Vamos a mantenerlo simple.
Combinando los dos
Awk y Sed son increíblemente poderosos cuando se combinan. Puede hacer esto usando tuberías Unix. Esos son los "|" bits entre 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:

Ahora volteemos eso. Vamos a comenzar eliminando todas las líneas que comienzan con Take, y luego las canalizamos a Awk, donde contaremos cuántas veces aparece cada palabra. Se parece un poco a esto:
gato tom.txt | sed / ^ Take / d | awk -f WordCount.awk

El poder de Sed y Awk
Solo 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 inagotable 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 excelentes para analizar archivos de registro. Esto es especialmente útil cuando intentas depurar un problema en su servidor LAMP ¿Se ha inscrito en un alojamiento web solo para SSH? No se preocupe: instale fácilmente cualquier software web¿No sabe lo primero sobre operar Linux a través de su potente línea de comando? No te preocupes más. Lee mas , o mirando sus registros de acceso para ver si su servidor ha sido pirateado.
¿Has encontrado un uso interesante para Sed y Awk? ¿Hay otras utilidades de Linux que consideras que son poco apreciadas? Avísame en los comentarios a continuación y chatearemos.
Matthew Hughes es un desarrollador y escritor de software de Liverpool, Inglaterra. Raramente se lo encuentra sin una taza de café negro fuerte en la mano y adora absolutamente su Macbook Pro y su cámara. Puedes leer su blog en http://www.matthewhughes.co.uk y síguelo en Twitter en @matthewhughes.