grep
、pgrep
、egrep
、およびfgrep
の違いと、それらの使用方法について説明します。
grepは、「Global Regular Expressions Print」の頭字語です。 grepは、指定されたファイルを1行ずつスキャンして、パターンを含む行を返すプログラムです。パターンは、文字をメタ文字として解釈して一連の文字列を指定する式です。たとえば、アスタリスクメタ文字(*)は、「0個以上の先行要素」を意味すると解釈されます。これにより、ユーザーはgrepコマンドに短い一連の文字とメタ文字を入力して、コンピューターにファイルが一致する行を表示させることができます。
標準のgrepコマンドは次のようになります。
grep <flags> '<regular expression>' <filename>
grepは、検索結果を画面(stdout)に出力し、次の終了値を返します。
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は、「Extended Global Regular Expressions Print」の頭字語です。
Egrepの「E」は、パターンを正規表現として扱うことを意味します。 egrepで「ERE」と省略された「拡張正規表現」が有効になります。 egrep(grep -E
と同じ)は、+
、?
、|
、(
、および)
をメタ文字として扱います。
基本的な正規表現(grepを使用)では、メタ文字?
、+
、{
、|
、(
、および)
は特別な意味を失います。 grepでこれらの文字をメタ文字として処理する場合は、\?
、\+
、\{
、\|
、\(
、および\)
をエスケープします。
たとえば、ここでgrepは基本的な正規表現を使用し、プラスが文字どおりに処理され、プラスが含まれるすべての行が返されます。
grep "+" myfile.txt
一方、egrepは「+」をメタ文字として扱い、プラスは「1回以上」と解釈されるため、すべての行を返します。
egrep "+" myfile.txt
+
はegrepによってメタ文字として扱われたため、ここではすべての行が返されます。通常のgrepは、リテラル+
を持つ行のみを検索します。
fgrepは、「Fixed-string Global Regular Expressions Print」の頭字語です。
fgrep(grep -Fと同じ)は固定または高速grepであり、grepとして動作しますが、正規表現のメタ文字を特別なものとして認識しません。複雑なパターンではなく単純な文字列のみを処理するため、検索はより速く完了します。
たとえば、.bash_profileでリテラルドット(。)を検索する場合、ドットは「ワイルドカード、任意の単一文字」を意味するメタ文字であるため、ドットをエスケープする必要があるため、grepの使用は困難です。
grep "." myfile.txt
上記のコマンドは、myfile.txtのすべての行を返します。代わりにこれを行います:
fgrep "." myfile.txt
次に、リテラル '。'を持つ行のみそれらが返されます。 fgrepは、メタ文字をわざわざエスケープするのに役立ちます。
pgrepは、「Process-ID Global Regular Expressions Print」の頭字語です。
pgrepは、現在実行中のプロセスを調べて、選択基準とstdoutに一致するプロセスIDをリストします。 pgrepは、プロセスのプロセスID整数だけを知りたい場合に便利です。たとえば、mysqlプロセスのプロセスIDのみを知りたい場合は、コマンドpgrep mysql
を使用し、7312のようなプロセスIDを返します。