コマンドリファレンス - パターンマッチ検索 grep, pgrep

 クラウディア
1. 概要
2. 基本形
3. ps との組み合わせ
4. 主なオプション
5. 正規表現
6. pgrep

1. 概要

 「grep」は、パターンにマッチする行を表示します。  改めて調べてみましたらば(2023年6月7日)、「Global Regular Expression Print」の頭文字なのだそうであります。  本ページは、下記のサイトを参考にさせていただきました。
grep の意味・使い方

2. 基本形

 基本形は下記のとおり。

grep [オプション] パターン [ファイル名|ディレクトリ名]
 「grep」は、ファイル名で名前を指定された入力ファイル (ファイルが指定されてないか、ファイル名の部分に - が指定された場合は標準入力) を読み込み、与えられた パターンにマッチする部分を含む行を探します。  デフォルト動作では、「grep」はマッチした行を表示します。

3. ps との組み合わせ

 パターンには正規表現が使用できます。  よく、「ps」と組み合わせて

ps ax | grep mysql
 とかやると

45684  -  Is        0:00.02 /bin/sh /usr/local/bin/mysqld_safe --defaults-extra-file=/var/db/mysql/my.cnf --basedir=/usr/local --
45938  -  I        15:49.89 /usr/local/libexec/mysqld --defaults-extra-file=/var/db/mysql/my.cnf --basedir=/usr/local --datadir=/
 6689  3  S+        0:00.00 grep mysql
 のような結果となって、「grep mysql」はいらないんだけどなぁ。となっちゃいますが。

ps ax | grep '[m]ysql'
 とすれば、

45684  -  Is        0:00.02 /bin/sh /usr/local/bin/mysqld_safe --defaults-extra-file=/var/db/mysql/my.cnf --basedir=/usr/local --
45938  -  I        15:49.89 /usr/local/libexec/mysqld --defaults-extra-file=/var/db/mysql/my.cnf --basedir=/usr/local --datadir=/
 となって「grep」の行は表示されません。  ただまぁこれも、下で述べる、「pgrep -l」の方がスマートではあります。

4. 主なオプション

 わたしが使う主なオプションは以下のものです。
 オプション    意味    備考 
-d アクション 入力ファイルがディレクトリの場合、アクションを使ってその処理を行います。
デフォルトのアクションは read で、通常の処理を行います。
アクションが skip ならば読み飛ばします。
アクションが recurse ならば再帰的に処理を行います(-r オプションと等価)。
--directories=アクション
--exclude=パターン パターンにマッチするファイルを検索対象から除外します。
--include=パターン パターンにマッチするファイルのみを検索対象とします。
-E パターンを拡張された正規表現として扱います。
--extended-regexp
-n 行番号を表示します。
-r 検索先がディレクトリであれば再帰検索します。
ファイル名指定の場合、エラーになるので注意。
-R
--recursive

 「-d」オプションは、「$HOME」の「.cshrc」関係のファイルを「grep」するときに役に立ちます。
 「.*」でかかるディレクトリが相当数ありますので。

 「--exclude=」、「--include=」で、ワイルドカードを使う際は、"(ダブルコーテーション)で囲みます。
 すなわち、あるディレクトリ以下を検索する際、同一ディレクトリに「.c」と「.o」が混在していて、「.o」を除外したい場合


grep -r 検索語 * --exclude="*.o"
 とします。  「.c」のみを検索対象とする場合は

grep -r 検索語 * --inlcude="*.c"

5. 正規表現

 引数で「-E」または「--extended-regexp」を指定すれば、検索するパターンを拡張正規表現として扱います。  わたしの使う、主な正規表現は、以下のとおり。
 記号   意味   備考 
^ 行頭
$ 行末
. 任意の1文字

 繰り返し演算子。

 演算子   意味   備考 
? 直前の項目はオプションであり、最大 1 回マッチ
* 直前の項目に 0 回以上マッチ
. 直前の項目に 1 回以上マッチ

6. pgrep 名前によるプロセスの検索

 「grep」の派生形?  コマンド名は、間違いなく「grep」から来ていると思いますが、ソースコード的にどうなっているかは、読んでいないのでわかりませんが。  「ps」に「grep」をからめたものと思って間違いありません。

pgrep [オプション] パターン
 わたしが使っているオプションは以下のものです。
オプション   意味    備考 
-f 完全な引数リストとマッチします。デフォルトでは、プロセス名とマッチします。
-l 長い出力を行います。マッチしたそれぞれのプロセスのプロセス ID の他に、プロセス名も出力します。
-f オプションと組み合わせて使用された場合、マッチしたそれぞれのプロセスのプロセス ID と完全な引数リストを表示します。このオプションは、 pgrep コマンドでのみ使用できます。
-n 最も新しく生成された、プロセス名にマッチするもの
-P ppid コンマ区切りのリスト ppid で与えられた親プロセス ID を持つプロセスのみにマッチを限定します。
DAEMON プロセスを見たいのであれば ppid に 0 を指定します。
-x プロセス名にマッチするもの

 詳細を見るならば、「-lf」がいいでしょう。

 「-l」、「-lf」の表示例


$ pgrep -l mysql
45938 mysqld

$ pgrep -lf mysql
45938 /usr/local/libexec/mysqld --defaults-extra-file=/var/db/mysql/my.cnf --basedir=/usr/local --datadir=/var/db/mysql --plugin-dir=/usr/local/lib/mysql/plugin --log-error=/var/log/mysql/mysqld.log --pid-file=/var/db/mysql/ns.sing.ne.jp.pid
45684 /bin/sh /usr/local/bin/mysqld_safe --defaults-extra-file=/var/db/mysql/my.cnf --basedir=/usr/local --datadir=/var/db/mysql --pid-file=/var/db/mysql/ns.sing.ne.jp.pid --user=mysql
ハイスピードプラン