
Я пишу скрипт оболочки для отправки логов 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 для более простого и лаконичного решения.