
我正在編寫一個 shell 腳本來將fail2ban 日誌傳送到postgres 資料庫。 The event timestamps in the application log annoyingly shows the milliseconds of the event separated with a comma (like this: 11:01:26,899), which postgres doesn't like and I don't need, here's an example of a line from the紀錄:
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
程式碼通常包含由 shell 解釋的字元(我們不希望這樣),因此最好習慣於引用。我們的命令最多對每行輸入進行一次替換。在一行中,只有第一個匹配的子字串將被替換。
,...
是一個簡單的圖案。如果每行以給定格式的時間戳開頭,則不需要複雜的模式或邏輯。
答案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 的答案以獲得更簡單、更簡潔的解決方案。