アプリ版:「スタンプのみでお礼する」機能のリリースについて

CentOS 5 を使っています。
とある巨大なログファイルがあります。
例えば grep hoge log.txt | tail -1 みたいな事をやっているのですが、これをどうにか高速にできないですかね?

上記だと、ログファイルを全検索しているので効率が悪いです。
(ログファイルはファイルの最後の方に新しい情報が記録されているので、その最新ログが見たいのです)
安易に思いつくのは tac コマンドを使って
tac log.txt | grep hoge | head -1
でもいいんですが、grep で「最初のマッチで終了」してくれるオプションもなさそうです。

何か良い方法があればご教示願います。
(ruby 等でスクリプトを書いても良いのですが、何とかワンライナーで出来ないかなと)

P.S
ちなみに実際の見たい情報は「grep でマッチした前後数行」なので -A や -B オプションを使っています。

A 回答 (2件)

> grep で「最初のマッチで終了」してくれるオプションもなさそうです。


mオプションがそうではないでしょうか。
http://linuxjm.sourceforge.jp/html/GNU_grep/man1 …

この回答への補足

おぉっ!なるほど、そんな感じですね。
時間見つけて試してみます。これで一応 tac コマンド + grep で目的は達成できそうですね。
ただし、-A や -B オプションを使っているので表示は逆になりますが・・・あっ、また tac すれば良いのか!

tac biglog.txt | grep -m 1 -A 2 -B 1 hoge | tac

結果は報告するようにします。

補足日時:2011/02/04 10:24
    • good
    • 0
この回答へのお礼

使用しているOSが古い(RHEL3)せいか -m オプションはありませんでした orz
特に困っているわけではないので大丈夫です。
スッキリしました。ありがとうございます。

お礼日時:2011/03/03 14:20

その「ログファイル」の構成とか「どのくらい高速化することを想定しているのか」にもよりそうだけど, 普通のログファイルなら劇的な高速化はできないと思う. どう頑張っても「ファイルを最後まで読み込む」より速くはならないし, grep がそれより極端に遅いとは思えない.


「100秒かかっているのが 99秒になる」くらいの高速化はできるかもしれんけど.

この回答への補足

説明不足でした。
単純にマッチ行がファイルの先頭付近なのか最後の方なのかで効率は変わります。
仮に先頭付近だった場合、最初の数行でマッチし、そこで処理を終了させればよいので、かなりの効率化になりますよね。
最後の方にあればしょうがないですね。

いづれにせよ、マッチした時点で grep が終了してくれれば良いです。(-l オプションは終了してくれるがマッチ行を出力しない)

補足日時:2011/02/02 19:11
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A