grep
, pgrep
, egrep
, fgrep
の違いや使い方をウォークスルーしてみたいと思います
58 None 2012-11-21
grep, pgrep, egrep, fgrep (Linux) の違い
grep
grepは「Global Regular Expressions Print」の頭文字をとったもので、指定したファイルやファイルを1行ずつスキャンして、パターンを含む行を返すプログラムです。パターンとは、文字をメタ文字として解釈して文字列の集合を指定する式のことです。例えば、アスタリスクのメタ文字(*)は、「前の要素のゼロ以上」を意味すると解釈されます。これにより、ユーザは grep コマンドに短い文字列とメタ文字を入力して、どのファイルのどの行がマッチしているかをコンピュータに教えてもらうことができるようになります
標準のgrepコマンドは以下のようになります
grep <flags> '<regular expression>' <filename>
grepは、検索結果を画面(標準出力)に表示し、以下の終了値を返します
0 A match was found.
1 No match was found.
>1 A syntax error was found or a file was inaccessible
(even if matches were found).
一般的なフラグは以下の通りです。-c
マッチに成功した数をカウントして実際のマッチを印刷しない、-i
検索の大文字小文字を区別しない、-n
各マッチの印刷の前に行番号を印刷する、-v
正規表現の補数を取る(マッチしない行を返す)、-l
式にマッチする行を持つファイルのファイル名を印刷する、などです
egrep
egrepは “Extended Global Regular Expressions Print “の頭文字をとったものです
egrepの’E’は、パターンを正規表現として扱うことを意味します。egrepでは、”拡張正規表現 “と呼ばれる’RE’の略語が有効になっています
(grep を使った) 基本的な正規表現では、メタ文字 ?
, +
, {
, |
, (
, )
は特別な意味を失います。grep でこれらの文字をメタ文字として扱いたい場合は、\?
, \+
, \{
, \|
, \(
, \)
をエスケープしてください
例えば、ここでは grep は基本的な正規表現を使用しており、プラスは文字通りに扱われ、プラスが含まれる行はすべて返されます
grep "+" myfile.txt
一方、egrepは “+”をメタ文字として扱い、プラスは “1回以上 “と解釈されるため、すべての行を返します
egrep "+" myfile.txt
ここでは、+
がメタ文字として扱われているため、すべての行が返されます
fgrep
fgrepは「固定文字列グローバル正規表現プリント」の頭文字をとったものです
fgrep (これは grep -F と同じです) は固定または高速な grep で、 grep と同じように動作しますが、正規表現のメタキャラクタを特別なものとしては認識しません。複雑なパターンではなく単純な文字列のみを処理するので、検索はより速く完了します
例えば、.bash_profileでリテラルのドット(.)を検索したい場合、grepを使うのは難しいでしょう
grep "." myfile.txt
上のコマンドは myfile.txt の全行を返します。代わりにこれを実行してください
fgrep "." myfile.txt
そうすると、リテラルの’.’を含む行だけが返されます。 fgrepは、メタ文字をエスケープする必要がないようにしてくれます
pgrep
pgrepは “Process-ID Global Regular Expressions Print “の頭文字をとったものです
pgrepは、現在実行中のプロセスを調べて、選択基準に合致するプロセスIDを標準出力にリストアップします。例えば、私のmysqlプロセスのプロセスIDだけを知りたい場合、pgrep mysql
コマンドを使用して7312のようなプロセスIDを返します
88 Eric Leschinski 2012-11-21