
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
次のコマンドは、カンマとカンマに続く 3 つの文字で構成される部分文字列を削除します。
sed 's/,...//' input.log
注記と説明:
技術的には、
s
コマンドは置換を行います。何かを削除するには、それを空の文字列に置き換えます。コードでは、関連する空の文字列は 2 番目と 3 番目のスラッシュの間にあります。正規表現では
,
リテラルであり、.
任意の文字と一致します。私は式を一重引用符で囲みました。この場合、このような引用符は不要ですが、一般的に
sed
コードにはシェルによって解釈される文字が含まれることが多いため (これは望ましくありません)、引用符の使用に慣れておくとよいでしょう。このコマンドは、入力行ごとに最大 1 つの置換を実行します。行内では、最初に一致する部分文字列のみが置換されます。
,...
単純なパターンです。各行が指定された形式のタイムスタンプで始まる場合、複雑なパターンやロジックは必要ありません。
答え2
ファイル の場合input.log
、次のsed
コマンドはタイムスタンプからミリ秒の要素を削除します。
sed -r 's/([0-9]{2}:[0-9]{2}:[0-9]{2})(,[0-9]{3})/\1/' input.log
これにより、上記の 2 つのキャプチャ グループ (キャプチャ グループ 1 は時間%H:%M:%S
、キャプチャ グループ 2 はコンマとミリ秒,%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 の回答を参照してください。