質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

grep

grepはコマンドライン上でテキスト検索を可能にするユーティリティーです。元はUnixのために用意されたものです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

1回答

899閲覧

ログ出力時のログをgrepしてActiveRecordの値だけを出力したい

terate

総合スコア103

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

grep

grepはコマンドライン上でテキスト検索を可能にするユーティリティーです。元はUnixのために用意されたものです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2018/08/18 02:47

下記 リンク先を参考に処理の時間をgrepして出力しました。
http://blog.tnantoka.com/posts/81

Completed 200 OK in 38ms (Views: 0.4ms | ActiveRecord: 6.0ms)
grep "Completed 200 OK in" production.log | awk '{ print $11 }' | sort -n

この時に、38msの38を出力でなく、ActiveRecord: 6.0msの6.0だけを出力するように上記のgrepを修正したいのですが、どう修正して打てば良いでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

以下、説明のため、引用元のブログ記事 に載っているログの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 を使う方法

  • $16326.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
  • または、以下のようにsubを使って、ms) を削除する(空文字列に置き換える)こともできます。(http://tpcg.io/gkHQYJ にも上げておきました。)

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 03:28

編集2018/08/18 08:19
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

terate

2018/08/18 07:30

こんなにご丁寧に詳しくありがとうございます!!本当に助かりました!感謝いたします><
jun68ykt

2018/08/18 08:16

解決したようで、よかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問