試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

grepコマンドの覚え書き

grepは文字列の検索を行い、ファイルもしくは標準入力からパターンに当てはまる行のみを標準出力に書き出すコマンドで、一致箇所があるかどうかも確認できる。

  1. 基本的な使い方
  2. 戻り値について
  3. パターンの指定について
  4. 一致したファイル名の表示
  5. 一致部分の表示について

基本的な使い方

grepの次には検索したい文字列を、その後ろにファイル名(複数可)を指定する。

$ grep [パターン] [ファイル...]

引数を1つだけ指定すると標準入力から検索し、コマンドの出力を(パイプ経由で)フィルタするように検索ができる。

$ [標準出力に文字列を出力するコマンド] | grep [パターン]

もちろん、多重にフィルタすることもできる。

$ [標準出力に文字列を出力するコマンド] | grep [パターン1] | grep [パターン2]

戻り値について

grepの戻り値
 一致あり一致なし
-vオプションなし01
-vオプションあり10
上記の他、不正なパターン文字列(例: 「[」や「[0-」など)があったり、入力ファイルが開けなかったりすると2が返る。
下のコードは、glxinfoというコマンドの実行結果に「direct rendering: Yes」が含まれるかどうかで処理を分岐する。

#! /bin/sh
if glxinfo | grep "direct rendering: Yes" >/dev/null; then
  zenity --info --text OK
else
  zenity --error --text NG
fi

これは、対象文字列が見つかったときにのみ値0を返すことを利用している。

パターンの指定について

単純に「ある文字列を見つけ出す」というのであればその文字列を指定すればよいが、正規表現によるパターン指定を行うこともできる。

(そのままの文字列を検索する例)
$ grep currently /usr/src/linux/Documentation/logo.txt
This is the full-colour version of the currently unofficial Linux logo
("currently unofficial" just means that there has been no paperwork and

(「[数字].[数字]」を検索する例)
$ grep "[[:digit:]]\.[[:digit:]]" /usr/src/linux/Documentation/HOWTO
  - main 2.6.x kernel tree
  - 2.6.x.y -stable kernel tree
  - 2.6.x -git kernel patches
  - 2.6.x -mm kernel patches
2.6.x kernel tree
(以下略)

(2008/11/5)egrep(grep -E)を使用した場合にのみ使える正規表現も存在する。
(2015/1/13)正規表現の挙動がオプションで選択できるという話で、記述するパターンによってはこれを指定する必要がある。

(既定の正規表現として実行)
$ echo "123456abc789" | grep -o "[a-z]+" 
(一致箇所の出力なし)

(拡張正規表現として実行)
$ echo "123456abc789" | egrep -o "[a-z]+"
abc

(Perlの正規表現として実行)
$ echo "123456abc789" | grep -P -o "[a-z]+"                                    
abc

パターン指定の詳細については、manページの「正規表現」も参照。

一致したファイル名の表示

-Hオプションを付けると、それがどのファイルに含まれるのかが表示される。引数に複数のファイルを指定したときには、このオプションを付けなくてもどのファイルの中なのかは表示されるので、findで条件に一致したときにgrepするといったときに使える。

$ find [ディレクトリ] ( [条件] ) -exec grep -H {} \;

下は-Hを付けない場合と付ける場合との比較。

(-Hオプションなしでfindから実行)
$ find /usr/src/linux/Documentation/ -exec grep "Most people" {} \;
driver.  Most people should not need to mess with any of these; they
Most people are idiots, and being a manager means you'll have to deal
   Most people will only want to hibernate to a local file. To achieve that, do

(-Hオプション付きでfindから実行)
$ find /usr/src/linux/Documentation/ -exec grep -H "Most people" {} \;
/usr/src/linux/Documentation/cdrom/ide-cd:driver.  Most people should not need to mess with any of these; they
/usr/src/linux/Documentation/ManagementStyle:Most people are idiots, and being a manager means you'll have to deal
/usr/src/linux/Documentation/power/tuxonice.txt:   Most people will only want to hibernate to a local file. To achieve that, do

あるディレクトリ以下のファイルを全て検索したいという場合、-rオプションが便利。

$ grep -r "Most people" /usr/src/linux/Documentation
/usr/src/linux/Documentation/cdrom/ide-cd:driver.  Most people should not need to mess with any of these; they
/usr/src/linux/Documentation/ManagementStyle:Most people are idiots, and being a manager means you'll have to deal
/usr/src/linux/Documentation/power/tuxonice.txt:   Most people will only want to hibernate to a local file. To achieve that, do

一致部分の表示について

(2008/10/26)-oオプションを付けると一致部分のみを取り出せる。通常(--color=auto)は端末への出力時に一致部分が強調表示されるものの、その行全体が表示される。

(通常の表示・実際には「jk」の部分だけ強調表示される)
$ echo "abcdefghijklmnopqrstuvwxyz" | grep "jk"
abcdefghijklmnopqrstuvwxyz

(一致部分のみ表示)
$ echo "abcdefghijklmnopqrstuvwxyz" | grep -o "jk"
jk

(2015/1/13)複数ファイルからの検索時に-oオプションを付けても「一致箇所がある」ことは分かるが、周辺の内容は分からない。

$ grep load-module /etc/pulse -ro
/etc/pulse/system.pa:load-module
/etc/pulse/system.pa:load-module
/etc/pulse/system.pa:load-module
(以下略)

$ grep load-module /etc/pulse -r
/etc/pulse/system.pa:load-module module-udev-detect
/etc/pulse/system.pa:load-module module-detect
/etc/pulse/system.pa:load-module module-esound-protocol-unix
(以下略)

強調表示は環境変数GREP_COLORSを使用し、既定の値は

mt=01;31:ml=:cx=:fn=35:ln=32:bn=32:se=36

となっている。
lsコマンドなどの色指定と要領は同じで「[名前1]=[コード1];[コード2];...:[名前2]=...」のようにつなげていく。*1

(2015/1/13)manページのリンク先を修正

参考URL:

関連URL:

使用したバージョン:

  • grep 2.5.1a(2.5.1a-r1)

*1:コードの区切りがセミコロン、項目の区切りがコロン