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


クラウディア 


1. 概要
2. 基本形
3. ps との組み合わせ
4. 主なオプション
5. 正規表現
6. 複数ファイル時の出力順
7. ファイル数を取得
8. pgrep 名前によるプロセスの検索
9. 参考サイト

1. 概要

 「grep」は、パターンにマッチする行を表示します。  改めて調べてみましたらば(2023年6月7日)、「Global Regular Expression Print」の頭文字なのだそうであります。

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 action 入力ファイルがディレクトリの場合、action を使ってその処理を行います。
デフォルトの action は read で、通常の処理を行います。
action が skip ならば読み飛ばします。
action が recurse ならば再帰的に処理を行います(-r オプションと等価)。
--directories=action
--exclude=パターン パターンにマッチするファイルを検索対象から除外します。
--include=パターン パターンにマッチするファイルのみを検索対象とします。
-E パターンを拡張された正規表現として扱います。
--extended-regexp
-F を改行で区切られた固定文字列のリストとして扱います。その文字列のどれかとマッチするかを調べます。
--fixed-strings
-l 通常の出力はせず、このオプションを指定しなかったときに出力される入力ファイルの名前を表示します。 スキャン動作は最初のマッチで終了します。
--files-with-matches
-n 行番号を表示します。
-r 検索先がディレクトリであれば再帰検索します。
ファイル名指定の場合、エラーになるので注意。
-R
--recursive

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

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


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

grep -r 検索語  * --inlcude="*.c"
 次項の正規表現を使用するのが面倒な場合、以下のように記述するのがいい感じ。

grep  -RlF 検索語 /path/to

5. 正規表現

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

 繰り返し演算子。

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

 逆に、「& ! . * ? \」の文字を検索語に使う場合は、「\」(バックスラッシュ)で、文字をエスケープします。

6. 複数ファイル時の出力順

 嫌なことに、「-R」オプションをつけて、ディレクトリを再帰的に検索する場合。  出力する内容がまちまちになります。  つまり、まったく同じ構成・内容をもつ2つのディレクトリで、「-R」オプションをつけて検索した際。  表示順が異なったりします。  これは、非常につらい。  順番を同じにするには。

grep -R keyword /path --include="*.extend" | sort
 と「|sort」をつける方法があります。  しかし、この場合、キーワード等に色付けしたものがすべで同じ色になってしまいます。  なんか、いい方法は、ないのですかねぇ?

7. ファイル数を取得

 事情がありましてな。  あるディレクトリ以下を「grep」して、全ファイル数とキーワードを含むファイル数が欲しかったですじゃ。  「Claude」上等兵に尋ねて、回答をもらいました。  「find」と組み合わせて。

dir=/path/to; kw=keyword; total=$(find "$dir" -type f | wc -l); hit=$(grep -Rl -- "$kw" "$dir" | wc -l); echo "全ファイル数: $total / keyword を含むファイル数: $hit"
 「keyword」に特殊文字を含む場合は、ダブルクォーテーションで囲む等、工夫が必要です。

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

9. 参考サイト

 本ページは、下記のサイトおよびを参考にさせていただきました。
「grep の意味・使い方」

audiobook.jp
earthcar(アースカー)
5G CONNECT
【usus ウズウズ】
サウンドハウス
健康サポート特集
U-NEXT
葬送のフリーレン Prime Video
EaseUS
薬屋の独り言
JETBOY
ハイスピードプラン
それがだいじWi-Fi
Amazonギフトカード
TikTok Shop 【リピート用プログラム】
ベルリッツ
ネットオークションの相場、統計、価格比較といえばオークファン
アフィリエイトのアクセストレード
損保との違い