【Linux】grepコマンド

Linux コマンドで目的の情報を抽出するためによく利用されるのが「grep」コマンドです。

 

 

正規表現を使いたい

明示的に「-E」オプションを付けます。

「-E」オプションを付けなくても「正規表現」が機能することが多いですが、お勧めはしません。

 

【例】

正規表現を使って各種リポジトリファイルから「updates」リポジトリを探します。

[updates]」という文字列を抽出したいのですが、「[」と「]」は「メタ文字(メタキャラ)」なのでエスケープをする必要があります。

[root@SAKURA_VPS yum.repos.d]# pwd
/etc/yum.repos.d
[root@SAKURA_VPS yum.repos.d]# ls
CentOS-Base.repo       CentOS-Vault.repo      groonga.repo      mysql-community-source.repo
CentOS-CR.repo         CentOS-fasttrack.repo  ius-archive.repo  mysql-community.repo
CentOS-Debuginfo.repo  elrepo.repo            ius-dev.repo      qt48.repo
CentOS-Media.repo      epel-testing.repo      ius-testing.repo
CentOS-Sources.repo    epel.repo              ius.repo
[root@SAKURA_VPS yum.repos.d]# grep -E "\[updates\]" *
CentOS-Base.repo:[updates]
[root@SAKURA_VPS yum.repos.d]#

 

 

man コマンドより「-E」オプションについて

-E オプションを付けると、明示的にパターンを正規表現として扱い、POSIX 規定が適用されます。

   正規表現の選択
       -E, --extended-regexp
              PATTERN を拡張正規表現 (ERE) として扱います (下記参照)。 (-E オプションは POSIX で規定されています)

 

man コマンドの「正規表現」の説明部分です。

正規表現
       正規表現とは、一群の文字列を一まとめにして表現するパターンのことです。
       正規表現の構成方法は、数式によく似ています。すなわち、さまざまな演算子を 使い、小さな表現を組み合わせて構成するのです。

       grep は、「基本」正規表現、「拡張」正規表現、「Perl の」正規表現という 3 種類の正規表現文法を扱うことができます。  

       GNU grep では、「基本」と「拡張」の文法の間で、利用できる機能に違いはありません。
       他の実装では、基本正規表現は拡張正規表現ほど強力ではないものです。                        

    ここでは、拡張正規表現について説明し、基本正規表現との相違については、後で簡単にまとめることにします。 

    なお、Perl の正規表現は機能がさらに増加しており、 pcresyntax(3) や pcrepattern(3) で詳細に解説されていますが、どのシステムでも利用できるとはかぎりません。

       正規表現を構成する基本単位は、1 文字にマッチする正規表現です。
       アルファベットや数字を含むほとんどの文字が、自分自身にマッチする正規表現です。
       また、特殊な意味を持つメタ文字も、その文字の前にバックスラッシュを付けると、その本来の文字にマッチするようになります。

       ピリオド . は、任意の 1 文字にマッチします。

   文字クラスと角括弧式 (ブラケット式)
       角括弧式とは、[ と ] で囲まれた文字のリストのことです。   

    角括弧式   は、リスト中の任意の 1 文字にマッチします。
       また、リストの最初の文字がキャレット ^ の場合は、リスト中の文字以外の任意の 1 文字にマッチします。

      たとえば、正規表現 [0123456789] は任意の数字 1 個にマッチするわけです。

       角括弧式の内側に範囲式を置くことができますが、これはハイフンで区切られた 2 つの文字からなっています。

     範囲式は、現在使用中のロケールにおける照合順序と 文字集合を使ったときに、その 2 文字の間に並ぶ、その 2 文字を含む任意の 1 文字にマッチします。

       たとえば、デフォルトの C ロケールでは、[a-d] は [abcd] と等価です。
       多くのロケールでは文字を辞書式の順序で並べていますが、そうしたロケールで [a-d] が [abcd] と等価でないこともよくあります。
       たとえば、[aBbCcDd] と等価かもしれないのです。

     角括弧式を伝統的な意味に解釈させたいなら、環境変数 LC_ALL の値を C に設定して、C ロケールを使用するとよいでしょう。

       最後に、角括弧式内で使えるように、特定の名前を持つ文字クラスがあらかじめ定義されています。
       名前が内容を示しており、それは次のようなものです。  

    [:alnum:], [:alpha:], [:cntrl:], [:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:], [:xdigit:]。 

    たとえば、 [[:alnum:]]  は  [0-9A-Za-z]  と同じです。

    ただし、後者が C ロケールや ASCII 文字コードに依存しているのに対して、前者はロケールや文字集合に依存しません。
       (こうしたクラス名に使用されている角括弧は、シンボル名の一部なので、角括弧式の前後に付く角括弧とは別に指定する必要があることに注意してください。)

       角括弧式の内側では、ほとんどのメタ文字がその特別な意味を持たなくなります。

       ] という記号そのものを角括弧式に含めるには、それをリストの先頭に置いてください。

     同様に、 ^ という記号そのものを含めるには、それを先頭以外のどこかに置けばよいでしょう。 

    最後に、- そのものを含めるには、それをリストの最後に置きます。

   行頭と行末 (アンカリング)
       キャレット ^ と ドル記号 $ は、それぞれ行頭と行末の空文字列にマッチするメタ文字です。

   バックスラッシュ付きの特別な表現
       シンボル \< とシンボル \> は、それぞれ単語の先頭と末尾の空文字列にマッチするメタ文字です。

       シンボル \b は単語の端の空文字列にマッチします。

    シンボル \B は単語の端以外の空文字列にマッチします。

     シンボル \w は [[:alnum:]] と同じ意味で、シンボル \W は [^[:alnum:]] と同じ意味です。

   繰り返し
       正規表現の後には、繰り返し演算子のどれかが続くことがあります。
       ?      直前の項目があってもなくてもよく、マッチするとしても 1 回だけということ。
       *      直前の項目が 0 回以上マッチするということ。
       +      直前の項目が 1 回以上マッチするということ。
       {n}    直前の項目がちょうど n 回マッチするということ。
       {n,}   直前の項目が n 回以上マッチするということ。
       {,m}   直前の項目が m 回以下マッチするということ。
       {n,m}  直前の項目が n 回以上 m 回以下マッチするということ。

   結合
       2 つの正規表現は結合することができます。    

    結果としてできあがる正規表現は、結合対象となる部分表現にそれぞれマッチする 2 つの部分文字列を結合して作られる、どんな文字列にもマッチします。    

 

   選択 

       2 つの正規表現は中置き型演算子の | で繋ぐことができます。

       結果としてできあがる正規表現は、どちらかの部分表現にマッチするどんな文字列にもマッチします。

   優先順位
       繰り返しは結合に優先します。また結合は選択に優先します。

       表現の 1 つのまとまりを括弧でくくると、その内側の式をこうした優先規則よりさらに優先させることができます。

      括弧でくくった部分は、1 つの部分表現になるのです。

   後方参照と部分表現
       n が 1 個の数字であるような後方参照 \n は、正規表現中の括弧で囲まれた n 番目の部分表現が前もってマッチした文字列とマッチします。

   基本正規表現と拡張正規表現
       基本正規表現では、メタ文字 ?, +, {, |, (, )  は、その特殊な意味を失います。バックスラッシュを付けた  \?,  \+,  \{,  \|,  \(,  \)
       を代わりに使用してください。

       元々の egrep は、{ をメタ文字としてサポートしていませんでしたし、{ の代わりに \{ をメタ文字としてサポートする egrep の実装も存在します。

       ですから、移植を考慮したスクリプトでは、grep -E のパターンで { を使用することは避けるべきです。

       { という記号そのものにマッチさせたいときは [{] を使うとよいでしょう。

       GNU の grep -E は、 { が繰り返し回数指定の始まりとして意味をなさない場合、それを特殊文字ではないと見なし、従来の用法のサポートを試みます。 

    たとえば、コマンド grep -E '{1' は、正規表現に文法エラーがあると報告するかわりに、2 文字からなる文字列 {1 を検索するのです。

      この動作は、POSIX.2 によって拡張として認められていますが、 移植を考慮したスクリプトでは使用しない方がよいでしょう。

 

 

POSIX とは

POSIX(ポシックス、ポジックス、英: Portable operating system interface)は、各種UNIXを始めとする異なるオペレーティングシステム (OS) 実装に共通のアプリケーションプログラミングインタフェース (API) を定め、移植性の高いアプリケーションソフトウェアの開発を容易にすることを目的としてIEEEが策定したAPI規格である。POSIXという名前はリチャード・ストールマンがIEEEに提案したものである。末尾の「X」はUNIX互換OSに「X」の字がつく名前が多いことからつけられた。ISO/IEC JTC 1/SC 22でISO/IEC 9945として国際規格になっている。

https://ja.wikipedia.org/wiki/POSIX

 

 

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人