Удалить запятую и следующие 3 символа из строки с помощью sed

Удалить запятую и следующие 3 символа из строки с помощью sed

Я пишу скрипт оболочки для отправки логов fail2ban в базу данных postgres. Временные метки событий в журнале приложения раздражающе показывают миллисекунды события, разделенные запятой (например: 11:01:26,899), что не нравится postgres и мне не нужно, вот пример строки из журнала:

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

Это единственное место в файле, где присутствует запятая. Можно ли с помощью sed удалить эту запятую и следующие 3 символа?

решение1

Следующая команда удаляет подстроки, состоящие из запятой и трех символов после запятой:

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

Примечания и пояснения:

  • Технически sкоманда выполняет замену. Мы удаляем что-то, заменяя это пустой строкой. В нашем коде соответствующая пустая строка находится между вторым и третьим слешем.

  • В регулярном выражении ,это буквально, .соответствует любому символу.

  • Я заключил выражение в одинарные кавычки. В данном случае такое кавычки излишне, но в общем sedкоде часто встречаются символы, которые интерпретируются оболочкой (а нам это не нужно), поэтому полезно привыкнуть к кавычкам.

  • Наша команда делает максимум одну замену на строку ввода. В строке будет заменена только первая совпадающая подстрока.

  • ,...это простой шаблон. Если каждая строка начинается с временной метки в заданном формате, тонет необходимости в сложной схеме или логике.

решение2

Учитывая файл input.log, следующая sedкоманда удалит компонент миллисекунд из временной метки:

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

Это заменяет две указанные выше группы захвата (первая группа захвата — это время, %H:%M:%Sа вторая группа захвата — это запятая и миллисекунды ,%3N) на первую группу захвата.

Затем это можно перенаправить в другой файл:

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

Где output.logнаходится выходной файл.

Обновлять:Удален ненужный gфлаг. Смотрите ответ @kamil-maciorowski для более простого и лаконичного решения.

Связанный контент