web-dev-qa-db-ja.com

grep、pgrep、egrep、fgrepの違いは何ですか?

greppgrepegrep、およびfgrepの違いと、それらの使用方法について説明します。

55
Eric Leschinski

Grep、pgrep、egrep、fgrepの違い(Linux):

grep

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は、式に一致する行を持つファイルのファイル名を出力します。

白rep

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

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

pgrepは、「Process-ID Global Regular Expressions Print」の頭字語です。

pgrepは、現在実行中のプロセスを調べて、選択基準とstdoutに一致するプロセスIDをリストします。 pgrepは、プロセスのプロセスID整数だけを知りたい場合に便利です。たとえば、mysqlプロセスのプロセスIDのみを知りたい場合は、コマンドpgrep mysqlを使用し、7312のようなプロセスIDを返します。

84
Eric Leschinski