次: Reporting Bugs, 前: Regular Expressions, 上: Top
gnu grepを呼び出す,シェルコマンドの例は以下のようになり ます.
grep -i 'hello.*world' menu.h main.c
これは,menu.hとmain.cで,文字列`world'が続く文字列 `hello'を含む,全ての行をリストアップします.これは,`.*'が, 行の0以上の文字にマッチするためです.See Regular Expressions. `-i'オプションは,grepに大文字小文字を無視させ, `Hello, world!'にマッチさせます.そうしなければマッチしません. grepの呼び出し方の詳細は,See Invoking.
以下にgrepの使用法に関する一般的な質問と回答を記述します.
grep -l 'main' *.c
カレントディレクトリで,内容に`main'があるCファイルの名前をリストアッ プします.
grep -r 'hello' /home/gigi
`hello'を,ディレクトリ/home/gigiの下の,全てのファイルで検 索します.検索ファイルをもっと制御するために,find, grepと,xargsを使ってください.例えば,以下のコマン ドはCファイルのみを検索します.
find /home/gigi -name '*.c' -print | xargs grep 'hello' /dev/null
これは,以下のコマンドとは異なります.
grep -r 'hello' *.c
それは単純に,現在のディレクトリのファイル名が`.c'で終るすべてのファ イルで`hello'を探します.ここでの-rは,再帰的が`.c'と いうファイルの一つがディレクトリであるという滅多に発生しない事象でのみ発 動するので,移植性のため不必要です.
grep -e '--cut here--' *
`--cut here--'にマッチする全ての行を検索します.`-e'がない場合, grepは,`--cut here--'をオプションのリストとして,分割し ようとします.
grep -w 'hello' *
単語全体で`hello'となるもののみを検索します.`Othello'にはマッ チしません.より制御するため,単語の最初と最後にマッチする,`\<'と `\>'を使ってください.例えば,以下のようにします.
grep 'hello\>' *
`hello'で終る単語のみを検索するので,単語`Othello'にマッチしま す.
grep -C 2 'hello' *
マッチした行の周りの文を,それぞれ2行出力します.
/dev/nullを加えてください.
grep 'eli' /etc/passwd /dev/null
以下を得るでしょう.
/etc/passwd:eli:DNGUTF58.IMe.:98:11:Eli Smith:/home/do/eli:/bin/bash
ps -ef | grep '[c]ron'
パターンが角カッコなしで書かれている場合,ps出力行の cronだけでなく,ps出力のgrepにもマッチしま す.プラットフォームによっては,psの出力が画面の幅に制限されて いることに注意してください.grepには,利用可能なメモリ以外には, 行の長さの制限は全くありません.
grepが,バイナリファイルから全てのマッチ行をリストアッ プした場合,生成された出力はおそらく役に立たず,ディスプレイにゴミを撒き 散らすでしょう.そのため,gnu grepは,明らかなバイナリファ イルからの出力は抑制します.明らかなバイナリファイルからも,gnu grepの出力を強制させるため,`-a'や `--binary-files=text'オプションを使用してください.“Binary file matches”メッセージをエミュレートするため,`-I'や `--binary-files=without-match'オプションを使用してください.
`grep -lv'は,1つ以上マッチしていない行を含む,全てのファイル名をリ ストアップします.マッチ行がない全てのファイル名をリストアップするために, `-L'や`--files-without-match'オプションを使ってください.
grep 'paul' /etc/motd | grep 'franc,ois'
`paul'と`franc,ois'の両方を含む全ての行を検索します.
特別なファイル名`-'を使用してください.
cat /etc/passwd | grep 'alain' - /etc/motd
後方参照を使用して行なうことが可能で,例えば,4文字の回文は基本的な正規 表現で書くことが可能です.
grep -w -e '\(.\)\(.\).\2\1' file
それは,単語"radar"や"civic"にマッチします.
Guglielmo Bondioniは,19文字までの長さのすべての回文を見つける,単一の 正規表現を提案しました.
egrep -e '^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\9\8\7\6\5\4\3\2\1$' file
これはgnuの拡張正規表現の拡張機能を使用してなされていることに注意し てください.それは他のgrepでは移植性が無いでしょう.
/bin/echo "ba" | egrep '(a)\1|(b)\1'
最初の交換で失敗し,最初のグループはマッチにならず,このため2番目の交換 でも失敗します.例えば,"aaba"にはマッチし,最初のグループはマッチに加わ り,2番目のマッチで再利用することが可能です.
grepはUnix上で行を編集するものとして生まれました.例えば, edは画面にマッチした行のリストを出力するために,この構文を使用 します.
global/regular expression/print g/re/p
fgrepは修正されたgrepを意味し,egrepは拡張 されたgrepを意味します.