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

 
1. grep パターンにマッチする行を表示する
2.  正規表現
3.  オプション
4. pgrep 名前によるプロセスの検索

1. パターンにマッチする行を表示する

 パターンにマッチする行を表示します。

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

2. 正規表現

 パターンには正規表現が使用できます。  よく 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 の方がスマートではあります。

3. オプション

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

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

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


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

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

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

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

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

 -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