sed を使用して行からカンマと次の 3 文字を削除します。

sed を使用して行からカンマと次の 3 文字を削除します。

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 の回答を参照してください。

関連情報