[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

6. 使用法

GNU grepを呼び出す,シェルコマンドの例は以下のようになり ます.

 
grep -i 'hello.*world' menu.h main.c

これは,‘menu.h’と‘main.c’で,文字列‘world’が続く文字列 ‘hello’を含む,全ての行をリストアップします.これは,‘.*’が, 行の0以上の文字にマッチするためです.See section 正規表現. ‘-i’オプションは,grepに大文字小文字を無視させ, ‘Hello, world!’にマッチさせます.そうしなければマッチしません. grepの呼び出し方の詳細は,See section grepの呼び出し.

以下にgrepの使用法に関する一般的な質問と回答を記述します.

  1. マッチしたファイルの名前のみリストアップするには,どうしたら良いのですか?
     
    grep -l 'main' *.c
    

    カレントディレクトリで,内容に‘main’があるCファイルの名前をリストアッ プします.

  2. ディレクトリを再帰的に検索するには,どうしたら良いのですか?
     
    grep -r 'hello' /home/gigi
    

    hello’を,ディレクトリ‘/home/gigi’の下の,全てのファイルで検 索します.検索ファイルをもっと制御するために,findgrepと,xargsを使ってください.例えば,以下のコマン ドはCファイルのみを検索します.

     
    find /home/gigi -name '*.c' -print | xargs grep 'hello' /dev/null
    

    これは,以下のコマンドとは異なります.

     
    grep -r 'hello' *.c
    

    それは単純に,現在のディレクトリのファイル名が‘.c’で終るすべてのファ イルで‘hello’を探します.ここでの‘-r’は,再帰的が‘.c’と いうファイルの一つがディレクトリであるという滅多に発生しない事象でのみ発 動するので,移植性のため不必要です.

  3. パターンが‘-’で始まる場合,どうすれば良いのでしょうか?
     
    grep -e '--cut here--' *
    

    --cut here--’にマッチする全ての行を検索します.‘-e’がない場合, grepは,‘--cut here--’をオプションのリストとして,分割し ようとします.

  4. 単語の一部ではなく,単語全体を検索したいのですが?
     
    grep -w 'hello' *
    

    単語全体で‘hello’となるもののみを検索します.‘Othello’にはマッ チしません.より制御するため,単語の最初と最後にマッチする,‘\<’と ‘\>’を使ってください.例えば,以下のようにします.

     
    grep 'hello\>' *
    

    hello’で終る単語のみを検索するので,単語‘Othello’にマッチしま す.

  5. マッチした行の周りの文脈を出力するには,どうしたら良いのでしょうか?
     
    grep -C 2 'hello' *
    

    マッチした行の周りの文を,それぞれ2行出力します.

  6. grepで強制的にファイル名を出力するにはどうしたら良いのでしょう か?

    /dev/null’を加えてください.

     
    grep 'eli' /etc/passwd /dev/null
    

    以下を得るでしょう.

     
    /etc/passwd:eli:DNGUTF58.IMe.:98:11:Eli Smith:/home/do/eli:/bin/bash
    
  7. ps出力で,奇妙な正規表現をなぜ使うのですか?
     
    ps -ef | grep '[c]ron'
    

    パターンが角カッコなしで書かれている場合,ps出力行の cronだけでなく,ps出力のgrepにもマッチしま す.プラットフォームによっては,psの出力が画面の幅に制限されて いることに注意してください.grepには,利用可能なメモリ以外には, 行の長さの制限は全くありません.

  8. grepは“バイナリファイルのマッチ”をなぜ報告するのですか?

    grepが,バイナリファイルから全てのマッチをリストアッ プした場合,生成された出力はおそらく役に立たず,ディスプレイにゴミを撒き 散らすでしょう.そのため,GNU grepは,明らかなバイナリファ イルからの出力は抑制します.明らかなバイナリファイルからも,GNU grepの出力を強制させるため,‘-a’や ‘--binary-files=text’オプションを使用してください.“Binary file matches”メッセージをエミュレートするため,‘-I’や ‘--binary-files=without-match’オプションを使用してください.

  9. grep -lv’は,なぜマッチしないファイル名を出力しないのですか?

    grep -lv’は,1つ以上マッチしていない行を含む,全てのファイル名をリ ストアップします.マッチ行がない全てのファイル名をリストアップするために, ‘-L’や‘--files-without-match’オプションを使ってください.

  10. ORは‘|’でできますが,ANDはどうするのですか?
     
    grep 'paul' /etc/motd | grep 'franc,ois'
    

    paul’と‘franc,ois’の両方を含む全ての行を検索します.

  11. 標準入力とファイルの両方を,どうすると検索できますか?

    特別なファイル名‘-’を使用してください.

     
    cat /etc/passwd | grep 'alain' - /etc/motd
    
  12. どのようにして正規表現で回文を表現するのですが?

    後方参照を使用して行なうことが可能で,例えば,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では移植性が無いでしょう.

  13. 垂直バーがある以下の正規表現はなぜ失敗するのですか?
     
    /bin/echo "ba" | egrep '(a)\1|(b)\1'
    

    最初の交換で失敗し,最初のグループはマッチにならず,このため2番目の交換 でも失敗します.例えば,"aaba"にはマッチし,最初のグループはマッチに加わ り,2番目のマッチで再利用することが可能です.

  14. grep, fgrep, egrepは何を意味するのですか?

    grepはUnix上で行を編集するものとして生まれました.例えば, edは画面にマッチした行のリストを出力するために,この構文を使用 します.

     
    global/regular expression/print
    g/re/p
    

    fgrepは修正されたgrepを意味し,egrepは拡張 されたgrepを意味します.


[ << ] [ >> ]           [冒頭] [目次] [見出し] [ ? ]

この文書は新堂 安孝によって2009年9月22日texi2html 1.82を用いて生成されました。