- 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
|