pco2699’s blog

学んだコード・技術について、保存しておく場所

grep + sedコマンドでlogから華麗に時刻を抜き出す

問い合わせ調査でせっかくなんで、grep + sedでフフフーンと華麗にログ調査をしようとしたら華麗にハマったのでメモ。

やりたかったこと

hoge 2018-08-10 07:31:31 hage

↑単純にこいつから時刻を抜き出したかった。

試したコマンド

$ echo "hoge 2018-08-10 07:31:31 hage" | sed -e 's/^.+\([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\).+$/\1/'

結果

hoge 2018-08-10 07:31:31 hage

なんでや!!!ってずっとなってました。

原因

Linuxコマンドだと{}にも\をつけてエスケープする必要があるんですよねー。
というわけで正解は↓

$ echo "hoge 2018-08-10 07:31:31 hage" | sed -e 's/^.+\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\).+$/\1/'

結果

2018-08-10 07:31:31

ちなみに

hoge (2018-08-10 07:31:31) hage

こんな感じで()をマッチングさせたい場合は、\(や\)を利用します。
(一個目のスラッシュがLinuxコマンドとしてのエスケープ、二個目のスラッシュが正規表現としてのエスケープ。ややこしや)

$ echo "hoge 2018-08-10 07:31:31 hage" | sed -e 's/^.+\(\\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\\)\).+$/\1/'

参考サイト

qiita.com