Elimine la coma y los siguientes 3 caracteres de la línea con sed

Elimine la coma y los siguientes 3 caracteres de la línea con sed

Estoy escribiendo un script de shell para enviar registros de fail2ban a una base de datos de Postgres. Las marcas de tiempo de eventos en el registro de la aplicación muestran de manera molesta los milisegundos del evento separados por una coma (como este: 11:01:26,899), lo cual a Postgres no le gusta y no necesito, aquí hay un ejemplo de una línea del registro:

2023-02-09 11:01:26,899 fail2ban.filter         [6823]: INFO    [sshd] Found xxx.xxx.xxx.xxx - 2023-02-09 11:01:26

Este es el único lugar del archivo donde hay una coma. ¿Es posible utilizar sed para eliminar esta coma y los 3 caracteres siguientes?

Respuesta1

El siguiente comando elimina subcadenas que constan de una coma y tres caracteres después de la coma:

sed 's/,...//' input.log

Notas y explicaciones:

  • Técnicamente el scomando hace un reemplazo. Eliminamos algo reemplazándolo con una cadena vacía. En nuestro código, la cadena vacía relevante se encuentra entre la segunda y la tercera barra.

  • En expresiones regulares ,es literal, .coincide con cualquier carácter.

  • Puse la expresión entre comillas simples. En este caso, dichas comillas son innecesarias, pero en general sedel código a menudo contiene caracteres que serían interpretados por el shell (y no queremos esto), por lo que es bueno acostumbrarse a las comillas.

  • Nuestro comando realiza como máximo un reemplazo por línea de entrada. En una línea, solo se reemplazará la primera subcadena coincidente.

  • ,...es un patrón simple. Si cada línea comienza con una marca de tiempo en el formato dado, entoncesno hay necesidad de un patrón o lógica complejos.

Respuesta2

Dado el archivo input.log, el siguiente sedcomando eliminaría el componente de milisegundos de la marca de tiempo:

sed -r 's/([0-9]{2}:[0-9]{2}:[0-9]{2})(,[0-9]{3})/\1/' input.log

Esto sustituye los dos grupos de captura anteriores (el grupo de captura uno es el tiempo %H:%M:%Sy el grupo de captura dos es la coma y los milisegundos ,%3N) con el primer grupo de captura.

Luego podría redirigirse a otro archivo:

sed -r 's/([0-9]{2}:[0-9]{2}:[0-9]{2})(,[0-9]{3})/\1/' input.log > output.log

¿Dónde output.logestá el archivo de salida?

Actualizar:Se eliminó la bandera innecesaria g. Consulte la respuesta de @ kamil-maciorowski para obtener una solución más simple y concisa.

información relacionada