2017-07-13 6 views
0

私は基本的に大きなファイルであるログファイルradius.logを取得しています。複数のユーザーのログが含まれています。PHPスクリプトでtailとgrepを使用する

最初のコマンド

tail -n 20 /tmp/radius.log 

これが最後の20件のログを返します。それがコマンドから期待されたものです。

2番目のコマンドは、

tail -n 20 /tmp/radius.log | grep "username" 

私は何を達成しようとしていることだけでなく、ユーザごとに、最後の20件のログを取得することです。 ここで私が問題に直面しているところです。ユーザーの最後のログ(最後の1ログ)のみが返されます。最後の10ログではusernameしか検索されないため、これも予想されます。

返される行数を200に増やすと、残りのログが表示されます。

tail -n 20 /tmp/radius.log | grep "username" 

しかし、特定のユーザーの最後の20ログのみを取得するコマンドはありますか?

grep "username" /tmp/radius.log | tail -n 20 

このソリューションは完全に正常に動作します。まず、すべてのログをusernameに取得し、最後に20個のログを出力します。しかし、これは時間のかかるプロセスです。

まだ効率的なものを試しています。

+0

radius.logは無限大になりますか? Grepはファイルが大きくなるほど遅くなります。ログをできるだけ小さく保つと、検索がより迅速になります。 – GreensterRox

答えて

3

あなたはいくつか不足している結果と他の方法は、2回

tail -n 5000 /tmp/radius.log | grep "username" | tail -n 20 

に尾を使用することであり、他に良い方法は、変換することである

最初にして、あなたのしっぽ
grep "username" /tmp/radius.log | tail -n 20 

ではgrepを実行する必要があなたのDBへのログイン(TokuDBを使ったMySQL)

+0

私はこのコードがまず "username"のすべてのログを取得した後、最後の20個のログを取得すると考えています。これは動作しますが、プロセスは時間を消費します。より良い解決策を探しています。 – prakashchhetri

+0

それは技術的な唯一の方法です... –

+0

ありがとう、第2の1つの 'テール-n 5000 /tmp/radius.log | grep "username" | tail -n 20 'は、現在のタスクの要件を満たします。あなたの答えをアップアップしています。しかし、他のソリューションにもオープンできるように、私はそれを受け入れないままにしています。 – prakashchhetri

関連する問題