2つの日付形式の正規表現SED

2つの日付形式の正規表現SED

両方の日付形式を受け入れるログファイルからDATEフィールドのみを抽出するsedの正規表現を作成するにはどうすればよいですか?

Jun  9 16:56:14 mailserver postfix ...
2017-06-04T06:59:36.984086+02:00 mailserver postfix ...

awkを使用して$ 1列を印刷すると、2番目の場合は機能しますが、1番目の場合は機能しません。

ベストアンサー1

この試み:

$ cat test.txt 
Jun  9 16:56:14 mailserver postfix ...
2017-06-04T06:59:36.984086+02:00 mailserver postfix ...
$ sed 's/^\([0-9:+\.T\-]*\|[A-Z][a-z]*\s*[0-9]*\s[0-9:]*\)\s.*/\1/' < test.txt 
Jun  9 16:56:14
2017-06-04T06:59:36.984086+02:00

説明する:

  • 行の先頭を一致させます。^
  • バックスラッシュ括弧を使用して、関心領域を代替項目の逆参照として含めます(下記参照)。つまり、「残りのログテキスト」の前の「日付」
  • 括弧内:2つのバリアントと一致します(\|2つのサブ表現の置換を表すために使用されます)。
  • 括弧の後:残りの行を捨てたいので、行の残りの部分と一致します(最初は少し直観に反しているようですが、次の点を参照してください)。
  • 変えるワイヤー(したがって、残りの部分を一致させます。)日付一致の逆参照:\1

おすすめ記事