15 consejos y trucos útiles del comando sed para las tareas diarias de administración del sistema Linux


Cada administrador del sistema 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 debe 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 a fin de lograr los objetivos mencionados anteriormente, y más.

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

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 sed one-liner devolverá las líneas 5 a 10 de myfile.txt:

# sed -n '5,10p' myfile.txt

2. Ver todo el archivo excepto un rango determinado

Por otro lado, es posible que desee imprimir todo el archivo excepto un cierto rango. Para excluir las líneas 20 a 35 de myfile.txt, haga lo siguiente:

# sed '20,35d' myfile.txt

3. Visualización de 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. Vamos a mostrar las líneas 5-7 y 10-13 de myfile.txt:

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

Como puede 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 caracteres (sustitución básica)

Para reemplazar cada instancia de la palabra versión con story en myfile.txt, haga lo siguiente:

# sed 's/version/story/g' myfile.txt

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

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

Para reemplazar varios espacios en blanco con un solo espacio, usaremos la salida de ip route show y 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 caracteres dentro de un rango

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

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

Por supuesto, puede indicar una sola línea a través de su número correspondiente en lugar de un rango.

6. Uso de expresiones regulares (sustitución avanzada): I

A veces, los archivos de configuración se cargan con 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 las líneas vacías o las que comienzan con # del archivo de configuración de Apache, haga lo siguiente:

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

El signo de intercalación seguido del signo de número (^#) indica el comienzo de una línea, mientras que ^$ representa líneas en blanco. Las barras verticales indican operaciones booleanas, mientras que la barra inclinada hacia atrás se usa para escapar de las barras verticales.

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

7. Uso de expresiones regulares (sustitución avanzada) - II

Para reemplazar una palabra que comienza con mayúsculas o minúsculas por otra palabra, también podemos usar sed. Para ilustrarlo, reemplacemos la palabra zip o Zip con rar en myfile.txt:

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

8. Visualización de líneas que contienen con un patrón determinado

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

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

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

9. Insertar espacios en archivos

Con sed, también podemos insertar espacios (líneas en blanco) para cada línea no 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 myfile.txt

Para insertar dos líneas en blanco, haga:

# sed 'G;G' myfile.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 que se describe en esta sugerencia:

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

10. Emulando dos2unix con edición en línea

El programa dos2unix convierte archivos de texto sin formato 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 in situ. Entonces, los cambios no se devolverá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. Edición in situ y copia de seguridad del archivo original.

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

Para ello, indique un sufijo después de la opción -i (entre comillas simples) que se utilizará 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. Cambio de pares de palabras

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 escaparse, al igual que los números 1 y 2.

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

  1. 1 representa el comienzo de cada línea hasta la coma.
  2. 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.

La salida deseada se indica en el formato SecondColumn (Apellido) + coma + espacio + FirstColumn (Nombre). Siéntase libre de cambiarlo a lo que desee.

13. Reemplazo de 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 start con stop 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, inicio no se reemplazará por detener, 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 con 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. Combinar sed y otros comandos

Por supuesto, sed se puede combinar con otras herramientas para crear comandos más potentes. Por ejemplo, usemos el ejemplo dado en TIP # 4 y extraiga 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 noveno campo (considerando un solo espacio como separador de campo), 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 ayudarlo con sus tareas diarias de administración del sistema. ¿Hay algún otro consejo que utilice con regularidad y le gustaría compartir con nosotros y el resto de la comunidad?

Si es así, no dude en hacérnoslo saber utilizando el formulario de comentarios a continuación. Las preguntas y los comentarios también son bienvenidos. ¡Esperamos tener noticias suyas!