こんにちは。
以下、説明のため、引用元のブログ記事 に載っているログの1行目を、以下のようにLOG_LINE
という変数に入れ、ここから326.1
を取り出す方法を考えます。
bash
1LOG_LINE='I, [2015-07-02T03:47:07.832647 #1439] INFO -- : Completed 200 OK in 374ms (Views: 35.2ms | ActiveRecord: 326.1ms)'
1. awk を使う方法
$16
で 326.1ms)
が取れますので、これの数値部分 326.1
だけを取得するためには、一例として以下のようにすればよいでしょう。( http://tpcg.io/kQR1k0 にも上げておきました。左上の[Execute]をクリックすると実行結果が右側に表示されます。)
bash
1#!/bin/bash
2
3LOG_LINE='I, [2015-07-02T03:47:07.832647 #1439] INFO -- : Completed 200 OK in 374ms (Views: 35.2ms | ActiveRecord: 326.1ms)'
4
5echo ${LOG_LINE} | awk '{ print substr($16, 1, index($16, "m")-1) }'
上記を使うとすれば、ご質問にあるgrep
から始まるコマンドは以下にすればよいです。
bash
1grep "Completed 200 OK in" production.log | awk '{ print substr($16, 1, index($16, "m")-1) }' | sort -n
bash
1#!/bin/bash
2
3LOG_LINE='I, [2015-07-02T03:47:07.832647 #1439] INFO -- : Completed 200 OK in 374ms (Views: 35.2ms | ActiveRecord: 326.1ms)'
4
5echo ${LOG_LINE} | awk '{ t=$16; sub(/ms)/, "", t); print t }'
2. sed を使う方法
以下のように、ActiveRecord:
の後に続く数値部分で、テキスト全体を置き換えます。
bash
1#!/bin/bash
2
3LOG_LINE='I, [2015-07-02T03:47:07.832647 #1439] INFO -- : Completed 200 OK in 374ms (Views: 35.2ms | ActiveRecord: 326.1ms)'
4
5echo ${LOG_LINE} | sed -E "s/^.*ActiveRecord: ([0-9.]+).*$/\1/"
上記を、http://tpcg.io/rh5oYc にも上げておきました。
以上、参考になれば幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/18 07:30
2018/08/18 08:16