2

偉大さを達成するために、日付と時刻の形式をログファイルからタイムスタンプに変換する必要があるスクリプトを書いています。後で簡単に比較できるようにしたい。

私のログファイルの形式は次のとおりです。

2012-11-06 10:32:45
<log message follows here on multiple lines in XML format> 

次の gawk 式を使用して、日付/時刻をタイムスタンプに変換しています。

$ gawk '/^([0-9]{2,4}-?){3} ([0-9]{2}\:?){3}/{print $0;gsub(/\:/," ");print mktime($0)}' logfile.txt

出力は次のようになります。

2012-11-01 15:27:28
1293719248

これは実際に私が探しているものですが、問題は正規表現が正しいかどうかです? 私は正規表現の達人にはほど遠いので、これで問題ないかどうかも知りたいです。正規表現に関しては、これをより洗練された方法で行うことができますか? ログ ファイルで使用されている形式は、そこで変更されることはありません。なぜなら、私はわざわざ世界共通の日付/時刻の一致を作成しなかったからです。多分私の表現の他の何かはfubarですか?:-)

4

3 に答える 3

4

一致する ERE:

2012-11-06 10:32:45

独自の行には次のとおりです。

^[[:digit:]]{4}(-[[:digit:]]{2}){2} [[:digit:]]{2}(:[[:digit:]]{2}){2}$

しかし、おそらく次の方法で逃げることができます:

^[[:digit:]]([[:digit:]: -][[:digit:]]{2}){6}$

誤った一致を取得することなく。

于 2012-11-06T17:51:06.427 に答える
3

ログファイルのみを操作する場合は、正規表現で問題ありません。ログファイルが常に有効な日時文字列を提供すると想定できるためです。(例:2012-13-56 28:23:77起こらない)

しかし、私が指摘したいのは、awk コードに問題がある可能性があるということです。

  • どのバージョンの gawk を使用しているかはわかりません (> 4.0 だと思います) --re-interval。バージョンが 4 未満の場合、オプションはデフォルトではありません。

  • 文字列の置換にエラーがあります: "-" を " " に置き換える必要がありますよね?

awk のマニュアルページ:

 mktime(datespec)
                 Turns datespec into a time stamp of the same form as returned by systime().  The datespec is a string of the form YYYY MM DD HH  MM  SS[  DST].

違いを見ます:

kent$  gawk '{print $0;gsub(/:|-/," ");print mktime($0)}' <<<"2012-11-01 15:27:28"
2012-11-01 15:27:28
1351780048

output with your awk line:
2012-11-01 15:27:28
1293719248
于 2012-11-06T10:18:13.963 に答える
3

正規表現を完全に廃止して、単にの失敗をテストすることもできます。mktime()明らかに、これは、データに日付/時刻の外観を持つ行が含まれているかどうかによって異なります。ただし、次のようなことを考えたことがないかもしれません。

awk '{ line = $0; gsub(/[:-]/, " "); time = mktime($0) } time != "-1" { print line ORS time }' file.txt

結果:

2012-11-06 10:32:45
1352161965

マニュアルページから:

If datespec does not contain enough elements or if the resulting time is out of 
range, mktime() returns −1.
于 2012-11-06T14:58:40.317 に答える