このエントリーをはてなブックマークに追加
スポンサーリンク

grep2

grep2コマンドとは

ファイルから指定の文字列を含む行のみを表示させる場合、grepコマンドを使います。通常はそれで何も問題はないのですが、結果を出力する前にOSの方である程度バッファリングをするため、tail -fの出力結果をフィルタリングしながらリアルタイム表示させようとして、

tail -f ファイル名 | grep 条件 | grep 条件

のようにtail -f に続いてgrepで条件を絞って表示させようとするとgrepのバッファが一杯になるまで結果を表示しなくなってしまいます。特にgrepを多重に連結させると、全てのgrepのバッファが一杯になるまで表示しなくなるので、まずリアルタイム表示は不可能です。

そこで、バッファリングを行わないgrepもどきを作りました。

作成方法

まず、下記リンクをクリックして、ソース一式をダウンロードします。
grep2-1.01.tar.gzをダウンロード
これを、適当なコンパイル用のディレクトリにアップします。

tar xvzf grep2-1.01.tar.gz
cd grep2-1.01
make
sudo make install

コンパイルが通れば、実行ファイルが/usr/local/binにコピーされます。外部ライブラリは使ってないので、configureスクリプトは入ってません。お使いの環境でコンパイルが通らない場合は、Makefileを書き換えてみてください。

このサイトで使っているサーバー(CentOS4.5)では正常にコンパイルする事ができましたが、全てのLinuxでコンパイルできるとは限りません。Linuxのディストリビューションによってはエラーが出てしまう事も考えられますが、その際は申し訳ありませんが、エラーの内容をチェックしてソースやMakefileの修正をお願いします。

使い方

ソースが正しくコンパイルされていれば実行ファイルgrep2というファイルが作られ、make installした時に、/usr/local/binにコピーされたと思います。このバイナリファイルを実行します。
書式
grep2 [-v] 検索文字 [-f 入力ファイル] [-o 出力ファイル] [--help]
検索文字・・・検索したい文字列を入れます。正規表現を使う事ができます。大文字と小文字は区別します。-vを指定するとマッチしないものを抽出します。

正規表現で使うメタ文字([や\や.)は、\をつけてエスケープしてください。

-f 入力ファイル・・・指定ファイルから読み込みます。指定しないと標準入力になります。

-o 出力ファイル・・・指定ファイルに出力します。指定しないと標準出力になります。

--help・・・簡単な使い方の説明を表示します。端末の文字コードはEUCにしておいてください。

原理

原理は簡単で、事前に出力先ファイルディスクリプタに対してsetbuf関数でバッファリングをオフにしてから、正規表現関数で入力ファイルを行単位でチェックした後、条件が合致したら表示させるというだけです。

使用例


tail -f /var/log/apache/access_log | grep2 -v jpg | grep2 -v gif | grep2 -v css 
 アクセスログ(パスはお使いのサーバーに合わせて読み替えてください)のうち、jpg、gif、cssを含まない行を逐次表示します。 
grep2 -f /var/log/apache/access_log google
 アクセスログのうち、googleを含む行を表示します。 
tail -f /var/log/apache/access_log | grep2 google | urldec  
 アクセスログのうち、googleを含むものをurlエンコードしながら逐次表示します。この機能を実現するためには、別途urldecが必要です。このサイトからダウンロードしてインストールしておいてください。 

制限時効

本家grepコマンドにある機能が全て使えるわけではありません。というより、ほとんど使えません。

例えば、ワイルドカードを使ってディレクトリを再帰的に検索して指定の文字列を含むファイルを探す事はできません。そういう時は、grepコマンドを使ってください。

本家grepでは[条件|条件]でor検索とかもできますが、grep2ではできません。

1行の長さは2万バイトまでです。それ以上ある行は2万バイトで強制カットされます。全角全角文字の途中でも強制的にカットしますので、以降文字化けする場合があります。これは、主な目的がログのリアル出力である事と、改行コードがない巨大データーを読み込んだ時に、メモリー不足でサーバーがダウンしないよう行バッファをmaillogで動的にメモリーを確保せずに固定で2万バイト取っているためです。

エラーメッセージ

regcomp failed. errorcode[X]

正規表現でエラーが発生しました。検索文字を正しい正規表現に修正してください。Xは正規表現ライブラリで設定されたエラーコードが入りますが、エラーコードの詳しい意味はよくわかりませんでした。

免責事項

ご利用に関してはあくまで自己責任でお願いします。当プログラムによって生じた一切の責任は負いかねますのでご了承ください。
スポンサーリンク