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 simple diariamente. 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 secuencias, y compartiremos 15 consejos para usarlo con el fin de lograr los objetivos mencionados anteriormente y más.

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

Las herramientas como cabeza y cola 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 hasta 10 desde myfile.txt

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

2. Viendo el archivo completo excepto un rango dado

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:

# sed '20,35d' myfile.txt

3. Viendo 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 , haz:

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

Además, es posible que desee considerar usar gi en lugar de g para ignorar el caso del personaje:

# 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. Reemplazar 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 hacerlo

# 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. Usando expresiones regulares (sustitución avanzada) - I

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

Para eliminar las 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 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 utiliza para escapar de las barras verticales.

En este caso particular, el archivo de configuración de Apache tiene líneas con # ’s no al principio 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 con otra palabra, también podemos usar sed. Para ilustrar, reemplacemos la palabra zip o Zip con rar en myfile.txt :

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

8. Viendo líneas que contienen un patrón dado.

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 CentOS 7 servidor.

En este caso, el patrón a buscar es 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 que no esté vacía en un archivo. Para insertar una línea en blanco cada otra línea en LICENCIA , un archivo de texto sin formato, haga:

# sed G myfile.txt

Para insertar dos líneas en blanco, haga:

# sed 'G;G' myfile.txt

Agregue una mayúscula G 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:

Esta sugerencia puede ser útil si desea inspeccionar un archivo de configuración grande. Insertar un espacio en blanco en cada línea 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 del formato de 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 se eliminaron con:

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

Tenga en cuenta que la opción -i indica la edición en el lugar. Luego, 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 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 la sugerencia anterior usamos sed para modificar un archivo pero no guardamos el archivo original. A veces es una buena idea guardar una copia de respaldo del archivo original por si acaso.

Para hacerlo, 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 el caso) 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

Supongamos que tiene un archivo con 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 represents the beginning of each line up to the comma.
  2. 2 is a placeholder for everything that is right of the comma to the end of the line.

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

13. Reemplazar palabras solo si se encuentra una coincidencia por separado

A veces, reemplazar todas las instancias de una palabra determinada o unas pocas aleatorias no es precisamente lo que necesitamos. Quizás debamos realizar el reemplazo si se encuentra una coincidencia por separado.

Por ejemplo, podemos querer reemplazar inicio con 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, inicio no se reemplazará con 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 . Reemplazemos las palabras que y la línea en myfile.txt con This y verse, respectivamente.

Observe cómo se puede hacer esto usando un comando ordinario de sustitución sed 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 otras herramientas para crear comandos más potentes. Por ejemplo, utilicemos el ejemplo dado en TIP # 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 múltiples espacios en uno solo. Finalmente, cortaremos el campo (considerando un solo espacio como separador de campo), que es donde la dirección IP es:

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

La imagen de abajo ilustra cada paso del comando anterior:

Resumen

En esta guía, hemos compartido 15 sugerencias y trucos para ayudarlo con sus tareas diarias de administración del sistema. ¿Hay algún otro consejo que use regularmente y que quiera compartir con nosotros y con 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 sus comentarios!