問い合わせ調査でせっかくなんで、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/'