GNU/Linux >> Tutoriales Linux >  >> Linux

3 comandos de Linux imprescindibles para la manipulación de texto

Los administradores de sistemas usan una cantidad incalculable de herramientas de línea de comandos, y es probable que usted use regularmente las tres que se analizan en este artículo:grep , sed y awk . Pero, ¿conoces todas las formas en que puedes usarlos para manipular texto? Si no (o no está seguro), continúe leyendo.

Antes de comenzar, estos son los orígenes de los nombres de los comandos:

  1. grep :Según Wikipedia, el nombre "viene del ed comando g/re/p (g búsqueda local de una r e regular expresión x y p imprimir líneas coincidentes), que tiene el mismo efecto." ed es un "editor de texto orientado a líneas". Incluso para alguien a quien le gusta la línea de comandos, editar archivos línea por línea parece demasiado anticuado, pero la gente tenía que empezar con algo en la antigüedad. ).
  2. sed :El nombre proviene de su uso principal, como s tren ed itor.
  3. awk :Su nombre proviene de las iniciales de sus autores (Aho, Weinberger y Kernighan). Si el nombre Kernighan te suena (juego de palabras) es porque este científico informático canadiense contribuyó a la creación de Unix y es coautor del primer libro sobre el lenguaje C.

Es excelente rastrear el árbol genealógico de los comandos, pero lo que realmente importa es que estos comandos son muy útiles para la manipulación de texto.

En los siguientes ejemplos, usaré un archivo llamado quotes.txt para ilustrar cómo usar los comandos. Aquí está el contenido de este archivo:

$ cat quotes.txt

"God does not play dice with the universe."
- Albert Einstein, The Born-Einstein Letters 1916-55

"Not only does God play dice but... he sometimes throws them where they cannot be seen."
- Stephen Hawking

"I regard consciousness as fundamental..."
- Max Planck

"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
- Carl Sagan

"[T]he atoms or elementary particles themselves are not real; they form a world of potentialities or possibilities rather than one of things or facts."
- Werner Heisenberg

grep

La forma más sencilla de usar grep es:

$ grep universe quotes.txt

"God does not play dice with the universe."
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."

Este ejemplo proporciona la cadena para buscar (universo) y el lugar para buscarla (quotes.txt).

Si hay espacios en la cadena que desea buscar, debe poner comillas alrededor:

$ grep "the universe" quotes.txt

"God does not play dice with the universe."
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."

Algunas variaciones comunes al usar grep son:

  • Ignorar mayúsculas y minúsculas:grep -i string-to-search filename
  • Buscar en varios archivos:grep -i string-to-search *.txt

Puede buscar una expresión regular:

$ grep "191[0-9]" quotes.txt

- Albert Einstein, The Born-Einstein Letters 1916-55

Si desea habilitar patrones de expresiones regulares extendidas para usar símbolos como + , ? , o | , puede usar el egrep comando, que es un atajo para agregar el -E marcar a grep . Esto también le permite buscar varias cadenas:

$ egrep -i "albe|hawk" quotes.txt

- Albert Einstein, The Born-Einstein Letters 1916-55
- Stephen Hawking

Para mostrar líneas que incluyen la palabra "universo" más la siguiente línea (para incluir el nombre del autor):

$ grep -i universe -A 1 quotes.txt

"God does not play dice with the universe."
- Albert Einstein, The Born-Einstein Letters 1916-55
--
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
- Carl Sagan

Como probablemente pueda adivinar, podría mostrar más líneas pasando un número diferente. O podría mostrar las líneas antes usando la bandera -B .

Hasta ahora, he mostrado grep corriendo solo, pero es muy común tenerlo en una cadena de comandos:

$ echo "Authors who mentioned 'universe'"; cat quotes.txt | grep -i universe -A 1 | grep "^-"

- Albert Einstein, The Born-Einstein Letters 1916-55
- Carl Sagan

[ También podría estar interesado en leer 11 comandos de Linux sin los que no puedo vivir. ]

sed

Mi uso favorito para sed es reemplazar cadenas en archivos. Por ejemplo:

$ cat quotes.txt | sed 's/universe/Universe/g'

Esto reemplazará a universe con Universe y envía el resultado a stdout . El g flag significa "reemplazar todas las apariciones de la cadena en cada línea".

Algunas variaciones para esto son:

  • Reemplace la cadena solo si se encuentra en las tres primeras líneas:
    sed '1,3 s/universe/Universe/g' quotes.txt
  • Reemplace el n -ésima aparición de un patrón en una línea (por ejemplo, la segunda aparición):
    sed 's/universe/Universe/2' quotes.txt

Estos ejemplos no cambian el archivo original. Si quieres sed para cambiar el archivo en su lugar, use -i :

$ sed -i 's/universe/Universe/g' quotes.txt

Si usa el -i marca, asegúrese de saber exactamente qué y cuántas ocurrencias se verá afectado, ya que modificará el archivo original. Para averiguarlo, puede ejecutar un grep y busque el patrón primero.

[ ¿Quiere poner a prueba sus habilidades de administrador de sistemas? Tome una evaluación de habilidades hoy. ]

wow

El awk La utilidad es muy poderosa y ofrece muchas opciones para procesar archivos de texto.

La mayoría de las situaciones en las que uso awk involucran el procesamiento de archivos con una estructura (columnas) que es razonablemente predecible, incluido el carácter utilizado como separador de columnas.

Cuando awk procesa un archivo, divide cada línea usando el "separador de campo" (variable interna FS , que por defecto es el carácter de espacio). Cada campo se asigna a variables posicionales ($1 contiene el primer campo, $2 contiene el segundo, y así sucesivamente. $0 representa la línea completa).

También puede aplicar filtros a cada línea. Por ejemplo:

$ cat quotes.txt | awk '/universe/ { print NR " - " $0 }'

1 - "God does not play dice with the universe."
10 - "The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."

Los comandos pasados ​​a awk use comillas simples (es como pasar un mini-programa para que lo interprete):

  • El /universe/ parte le dice a awk para seleccionar solo las líneas que coincidan con este patrón.
  • El programa "principal" va entre corchetes.
  • NR es la variable interna que contiene el número del registro actual, por ejemplo, el número de línea actual.
  • Agregué el " -" cadena para la estética.

Las variables internas en awk son:

  • NR :El número total de registros de entrada vistos hasta ahora por el comando
  • NF :El número de campos en el registro de entrada actual
  • FS :El separador de campo de entrada (un espacio por defecto)

Aquí hay un ejemplo usando un formato de archivo más "predecible":

$ cat /etc/passwd | awk '/nologin/ { FS=":"; print $1 }'

(output omitted)
...
redis
akmods
cjdns
haproxy
systemd-oom

En este último ejemplo:

  • /nologin/ selecciona solo las líneas que contienen este patrón.
  • FS=": "; establece el separador de campo en : en lugar del predeterminado (espacio).
  • print $1 imprime el primer campo de cada línea (considerando que el separador es : ).

Más información

Esos fueron algunos ejemplos simples para usar grep , sed y awk .

Si lees el man páginas para cada uno, notará muchos parámetros y usos adicionales para estos útiles comandos.

Para casos de uso simples y cosas que hace solo de vez en cuando, siempre es bueno tener herramientas como estas en su caja de herramientas.

Si la acción requerida es más compleja, vale la pena considerar si estas herramientas aún tienen sentido para su uso. Para un caso de uso corporativo o para administrar "todo como código", recomiendo usar Ansible. Los módulos de Ansible tienen características similares que le permiten emular las operaciones descritas anteriormente, con la ventaja de que los módulos de Ansible generalmente tienen idempotencia y que el proceso completo se documentará en algún lugar (como en su repositorio interno de Git).


Linux
  1. 20 comandos esenciales de Linux para cada usuario

  2. 3 hojas de trucos esenciales de Linux para la productividad

  3. 8 comandos de Linux para una gestión de procesos eficaz

  4. 12 comandos útiles para filtrar texto para operaciones de archivo efectivas en Linux

  5. 10 comandos de Linux para diagnóstico de red

Comando Grep en Linux (Buscar texto en archivos)

Los mejores comandos de Linux para administradores de sistemas

eSpeak NG:un sintetizador de texto a voz para Linux

Encuentra texto en archivos en Linux usando grep

Comandos para la Gestión de Procesos en Linux

Hardware de terminal de texto (para Linux)