1

次のCSVファイル形式について考えてみましょう。

server_name status_code timestamp probe_name

ここで、status_codeはIまたはEのいずれかであり、すべてのフィールドは表で区切られます

例として、次のCSV行を検討できます。

albatros.benches.com I 14:55:23.145 througput_probe

すべてのCSVファイルには、1日分のログが含まれています。すべてのhh:mm:ssタイムスタンプの前に実際のYYYY-mm-ddを付けようとしているので、結果の行は次のようになります。

albatros.benches.com I 2013-02-25 14:55:23.145 througput_probe

ボーナスとして、CSVファイルには日付が含まれているため(ファイル名はlog_2013_02_25.txt)、これらのファイルの多くは(もちろんさまざまな日に)「シード」されるので、ファイル名を自動的に使用できればと思います。その中の適切な日を取得し、タイムスタンプ変換に適用するためのシードとして。

編集:ファイル名はlog_YYYY_MM_DD.txtであり、前述のlog_YYYY-MM-DD.txtではありません)

私のsedと正規表現の知識はかなり限られています。これまでのところ、私は次のようなものを使用しています:

s/I^T/I^T 2013-02-25 /g
s/E^T/E^T 2013-02-25 /g

(^Tは実際には^Vの後にタブキーを押すことです)

私のすべてのファイルにありますが、これは本当に私には非常に厄介に見えます。ある日、別のステータスコード(たとえばX)を追加すると、このトリックは機能しません。sedが3番目のフィールドを処理し、プレフィックスを付けると、エラーが発生しやすくなると思います。これを正しく行う方法がわかりません。

どんなアイデアでも大歓迎です!

ありがとうございました

4

1 に答える 1

3

csv ファイルがlog_YYYY_MM_DD.txtあるディレクトリでこの bash スクリプトを実行してみてください。

#!/bin/bash
for file in log_*.txt; do
    [[ $file =~ [0-9]{4}_[0-9]{2}_[0-9]{2} ]] \
        && date="${BASH_REMATCH}" \
        && sed -E -i.bak "s/\t(E|I)\t/\t\1\t${date//_/-} /" $file
done

処理する必要があるすべてのステータス コードは、括弧内に入れることができます。たとえば、ステータス コードも処理するにXは、単に に変更(E|I)(E|I|X)ます。

すべてが期待どおりに機能することに気付いた場合は、 を削除し.bakてバックアップ ファイルの作成を無効にすることができます。

于 2013-02-25T20:33:59.743 に答える