Búsqueda de sitios web

15 consejos del comando Sed para tareas de administración del sistema Linux


Todo administrador de sistemas tiene que lidiar con archivos de texto sin formato a diario. Saber cómo ver ciertas secciones, cómo reemplazar palabras y cómo filtrar el contenido de esos archivos son habilidades que debes tener a mano sin tener que hacer una búsqueda en Google.

En este artículo revisaremos sed, el conocido editor de transmisiones, y compartiremos 15 consejos para usarlo para lograr los objetivos mencionados anteriormente y más.

¿Qué es el comando Sed?

El comando 'sed', abreviatura de editor de secuencias, es una herramienta de manipulación de texto potente y versátil que opera en secuencias de texto, lo que permite a los usuarios realizar diversas operaciones con datos, como buscar, reemplazar, insertar y borrar. 'Sed' utiliza expresiones regulares para definir patrones para la manipulación de texto y puede emplearse para tareas de edición por lotes y procesamiento de texto en scripts.

Una de sus características notables es la edición in situ, donde puede modificar archivos directamente o crear copias de seguridad mientras realiza cambios. 'Sed' es una herramienta esencial para administradores de sistemas, programadores y cualquier persona que se ocupe de tareas de transformación de texto y manipulación de datos en la línea de comandos.

A continuación se muestran algunos comandos 'sed' comunes con ejemplos:

1. Ver un rango de líneas de un archivo

Herramientas como head y tail nos permiten ver la parte inferior o superior de un archivo. ¿Qué pasa si necesitamos ver una sección en el medio? El siguiente resumen sed devolverá las líneas 5 a la 10 de tecmint.txt:

sed -n '5,10p' tecmint.txt

2. Ver el archivo completo excepto un rango determinado

Por otro lado, es posible que desees imprimir el archivo completo excepto un rango determinado. Para excluir las líneas 20 a la 35 de tecmint.txt, haga lo siguiente:

sed '20,35d' myfile.txt

3. Ver líneas y rangos no consecutivos

Es posible que esté interesado en un conjunto de líneas no consecutivas o en más de un rango. Mostremos las líneas 5-7 y 10-13 de tecmint.txt:

sed -n -e '5,7p' -e '10,13p' tecmint.txt

Como puedes ver, la opción -e nos permite ejecutar una acción determinada (en este caso, imprimir líneas) para cada rango.

4. Reemplazo de palabras o cadenas en un archivo

Para reemplazar cada instancia de la palabra version con story en tecmint.txt, haga lo siguiente:

sed 's/version/story/g' tecmint.txt

Además, es posible que desees considerar el uso de gi en lugar de g para ignorar las mayúsculas y minúsculas:

sed 's/version/story/gi' myfile.txt

Para reemplazar múltiples espacios en blanco con un solo espacio, usaremos el resultado del comando ip route show con una canalización:

ip route show | sed 's/  */ /g'

Compare la salida de ip route show con y sin la canalización:

5. Reemplazo de palabras o cadenas dentro de un rango

Si está interesado en reemplazar palabras solo dentro de un rango de líneas (de 30 a 40, por ejemplo), puede hacer lo siguiente:

sed '30,40 s/version/story/g' tecmint.txt

Por supuesto, puedes indicar una sola línea mediante su número correspondiente en lugar de un rango.

6. Eliminar comentarios de un archivo

A veces los archivos de configuración están cargados de comentarios. Si bien esto es ciertamente útil, a veces puede ser útil mostrar solo las directivas de configuración si desea verlas todas de un vistazo.

Para eliminar líneas vacías o aquellas que comienzan con # del archivo de configuración de Apache, haga:

sed '/^#\|^$\| *#/d' httpd.conf

El signo de intercalación va seguido del signo numérico (^#) indica el comienzo de una línea, mientras que ^$ representa líneas en blanco. Las barras verticales indican operaciones booleanas, mientras que la barra invertida se utiliza para escapar de las barras verticales.

En este caso particular, el archivo de configuración de Apache tiene líneas con #’s que no están al principio de algunas líneas, por lo que *# se usa para eliminarlas también.

7. Reemplazar una palabra que no distingue entre mayúsculas y minúsculas en un archivo

Para sustituir una palabra que empieza en mayúscula o minúscula por otra palabra, también podemos utilizar sed. Para ilustrar, reemplacemos la palabra zip o Zip por rar en tecmint.txt:

sed 's/[Zz]ip/rar/g' tecmint.txt

8. Encontrar eventos específicos en un archivo de registro

Otro uso de sed consiste en imprimir las líneas de un archivo que coinciden con una expresión regular determinada. Por ejemplo, nos puede interesar ver las actividades de autorización y autenticación que tuvieron lugar el 2 de julio, según el /var /log/secure inicia sesión en un servidor CentOS.

En este caso, el patrón a buscar es 2 de julio al principio de cada línea:

sed -n '/^Jul  1/ p' /var/log/secure

9. Insertar espacios o líneas en blanco en un archivo

Con sed, también podemos insertar espacios (líneas en blanco) para cada línea que no esté vacía en un archivo. Para insertar una línea en blanco cada dos líneas en LICENCIA, un archivo de texto sin formato, haga lo siguiente:

sed G tecmint.txt

Para insertar dos líneas en blanco, haga:

sed 'G;G' tecmint.txt

Agregue una G mayúscula separada por un punto y coma si desea agregar más líneas en blanco. La siguiente imagen ilustra el ejemplo descrito en este consejo:

Este consejo puede resultar útil si desea inspeccionar un archivo de configuración grande. Insertar un espacio en blanco cada dos líneas y canalizar la salida a menos dará como resultado una experiencia de lectura más amigable.

10. Eliminar ^M en un archivo

El programa dos2unix convierte archivos de texto plano de formato Windows/Mac a Unix/Linux, eliminando los caracteres de nueva línea ocultos insertados por algunos editores de texto utilizados en esas plataformas. Si no está instalado en su sistema Linux, puede imitar su funcionalidad con sed en lugar de instalarlo.

En la imagen de la izquierda podemos ver varios caracteres de nueva línea de DOS (^M), que luego fueron eliminados con:

sed -i 's/\r//' myfile.txt

Tenga en cuenta que la opción -i indica edición en el lugar. Entonces los cambios no volverán a la pantalla sino que se guardarán en el archivo.

Nota: Puede insertar caracteres de nueva línea de DOS mientras edita un archivo en el editor Vim con Ctrl+V y Ctrl+M.

11. Cree un archivo de copia de seguridad con el comando Sed

En el consejo anterior, usamos sed para modificar un archivo pero no guardamos el archivo original. A veces es buena idea guardar una copia de seguridad del archivo original por si acaso.

Para hacer eso, indique un sufijo después de la opción -i (entre comillas simples) que se usará para cambiar el nombre del archivo original.

En el siguiente ejemplo, reemplazaremos todas las instancias de this o This (ignorando mayúsculas y minúsculas) con eso en myfile.txt y guardaremos el archivo original como myfile.txt.orig.

Finalmente, usaremos la utilidad diff para identificar las diferencias entre ambos archivos:

sed -i'.orig' 's/this/that/gi' myfile.txt

12. Cambiar pares de palabras en un archivo

Supongamos que tiene un archivo que contiene nombres completos en el formato Nombre, Apellido. Para procesar adecuadamente el archivo, es posible que desee cambiar Apellido y Nombre.

Podemos hacer eso con sed con bastante facilidad:

sed 's/^\(.*\),\(.*\)$/\, /g' names.txt

En la imagen de arriba podemos ver que los paréntesis, al ser caracteres especiales, deben tener caracteres de escape, al igual que los números 1 y 2.

Estos números representan las expresiones regulares resaltadas (que deben aparecer entre paréntesis):

  • 1 representa el comienzo de cada línea hasta la coma.
  • 2 es un marcador de posición para todo lo que está a la derecha de la coma hasta el final de la línea.

El resultado deseado se indica en el formato SegundaColumna (Apellido) + coma + espacio + PrimeraColumna (Nombre). Siéntete libre de cambiarlo por lo que desees.

13. Reemplazar palabras solo si se encuentra una coincidencia separada

A veces, reemplazar todas las instancias de una palabra determinada, o unas pocas al azar, no es precisamente lo que necesitamos. Quizás necesitemos realizar el reemplazo si se encuentra una coincidencia separada.

Por ejemplo, es posible que deseemos reemplazar iniciar por detener solo si la palabra servicios se encuentra en la misma línea. En ese escenario, esto es lo que sucederá:

We need to start partying at work,
but let’s remember to start all services first.

En la primera línea, start no se reemplazará por stop ya que la palabra servicios no aparece en esa línea, a diferencia de la segunda línea.

sed '/services/ s/start/stop/g' msg.txt

14. Realizar dos o más sustituciones a la vez

Puede combinar dos o más sustituciones en un solo comando sed. Reemplacemos las palabras that y line en myfile.txt con This y verse, respectivamente.

Observe cómo esto se puede hacer usando un comando de sustitución sed ordinario seguido de un punto y coma y un segundo comando de sustitución:

sed -i 's/that/this/gi;s/line/verse/gi' myfile.txt

Este consejo se ilustra en la siguiente imagen:

15. Combinando Sed y otros comandos

Por supuesto, sed se puede combinar con otros comandos de Linux para crear comandos más potentes. Por ejemplo, usemos el ejemplo dado en el CONSEJO n.º 4 y extraigamos nuestra dirección IP de la salida del comando ip route.

Comenzaremos imprimiendo solo la línea donde está la palabra src. Luego convertiremos varios espacios en uno solo. Finalmente, cortaremos el campo (considerando un solo espacio como separador de campos), que es donde está la dirección IP:

ip route show | sed -n '/src/p' | sed -e 's/  */ /g' | cut -d' ' -f9

La siguiente imagen ilustra cada paso del comando anterior:

Resumen

En esta guía, hemos compartido 15 consejos y trucos de sed para ayudarle con sus tareas diarias de administración del sistema. ¿Hay algún otro consejo que utilices habitualmente y te gustaría compartir con nosotros y el resto de la comunidad?

Si es así, no dude en hacérnoslo saber mediante el formulario de comentarios a continuación. También se aceptan preguntas y comentarios: ¡esperamos tener noticias suyas!