grepコマンド

記事の内容


grepコマンドについて簡単にまとめました. 動作環境は, MacBookPro+fishシェルです.

grepコマンドの使い方

grepコマンドの基本的な使い方は以下の通りです.

grepの基本】
grep 検索パターン ファイル名

このコマンドを実行すると, ファイル中から, 特定のパターンを含む行を検索します. 例を挙げます. 説明には, 次のファイルを用います. vim testを実行して作成します.

【ファイル作成: vim testを実行して書き込む】
Beethoven	1770-1827	Symphony No.9
Mozart	1756-1791	Requiem
Brahms	1833-1897	A German Requiem
Bach	1685-1750	St Matthew Passion
Wagner	1813-1883	The Ring of the Nibelung
R.Strauss	1864-1949	Also sprach Zarathustra
J.StraussII	1825-1899	The Blue Danube
Bruckner	1824-1896	Symphony No.8
Tchaikovsky	1840-1893	Violin Concerto
Dvořák	1841-1904	Cello Concerto 

使い方1: 文字列

まずは, 検索パターンが文字列の場合です.

次のコマンドにより, testファイル中の文字列"Ring"を含む行を検索できます.

【文字列検索1】
~> grep Ring test
【文字列検索1; 実行結果】
Wagner	1813-1883	The Ring of the Nibelung

次のコマンドにより, testファイル中の「文字列"sky"を含む単語」を含む行を検索できます. このように, 文字列は単語よりも小さい単位を指します.

【文字列検索2】
~> grep sky test
【文字列検索2; 実行結果】
Tchaikovsky	1840-1893	Violin Concerto

次のコマンドにより, testファイル中の文字列"Strauss"を含む行を検索できます. 結果は複数行です.

【文字列検索3】
~> grep Strauss test
【文字列検索3; 実行結果】
R.Strauss	1864-1949	Also sprach Zarathustra
J.StraussII	1825-1899	The Blue Danube

使い方2: 正規表現

次に, 検索パターンが正規表現で表される場合です. この場合, 基本的には, 検索パターンをクオーテーションで囲みます.

次のコマンドにより, testファイル中のBで始まる行を検索できます. "^"(カレット)は行の先頭を表します. 行の末尾は"$"です.

【正規表現検索1】
~>  grep "^B" test
【正規表現検索1; 実行結果】
Beethoven	1770-1827	Symphony No.9
Brahms	1833-1897	A German Requiem
Bach	1685-1750	St Matthew Passion
Bruckner	1824-1896	Symphony No.8

次のコマンドにより, "No.数字1桁"の形の文字列を含む行を検索できます. "[0-9]"は0から9の範囲の1桁の数字を指します.

【正規表現検索2】
~> grep "No.[0-9]" test
【正規表現検索2; 実行結果】
Beethoven	1770-1827	Symphony No.9
Bruckner	1824-1896	Symphony No.8

複数ファイル検索

次に, 検索対象のファイルが複数存在する場合です.以下のように書きます.

【複数ファイル検索】
~> grep pattern file1 file2

もう1つ検索対象のファイルを作成しておきます.

【ファイル作成: vim anotherfile
violin
viola
chello
Contrabass

次のコマンドにより, testファイルとanotherfile中の文字列"Violin"または"violin"を含む行を検索できます.

【複数ファイル検索】
~> grep "[Vv]iolin" test anotherfile
【複数ファイル検索; 実行結果】
test:Tchaikovsky	1840-1893	Violin Concerto
anotherfile:violin

一方, 1つのファイル中の2つのパターン検索は無理です. 複数パターンの検索に関しては, 後ほど説明します.

【複数パターン検索】
~> grep "[Vv]iolin" "[Cc]ello" test
【複数パターン検索; 実行結果(うまくいかない)】
grep: [Cc]ello: No such file or directory
test:Tchaikovsky	1840-1893	Violin Concerto

2つ目の検索パターンがファイル名として認識されています.

fgrepとggrep

fgrepegrepを使うと, 検索の幅が広がります. 特に, 複数のパターンを検索できます.

fgrepを使う

まずは, fgrepです. 高速で, 複数の文字列検索ができます. 検索パターンを次のようにファイルに保存します.

【ファイル作成: vim words
Zarathustra
Bach

次のコマンドにより, testファイル中の文字列"Zarathustra"または"Bach"を含む行を検索できます. 検索パターンのファイルを渡す時は, -fが必要です.

fgrepを使う】
~> fgrep -f words test
fgrepを使う; 実行結果】
Bach	1685-1750	St Matthew Passion
R.Strauss	1864-1949	Also sprach Zarathustra

egrepを使う

次に, egrepです. 複数の正規表現検索ができます. 検索パターンを次のようにファイルに保存します.

【ファイル作成: vim exprs
18[0-9]+-19[0-9]+
No.[0-9]

次のコマンドにより, testファイル中の「2列目が18○○~19○○」の形の文字列または, "No.数字1桁"の形の文字列を含む行を検索できます. 検索パターンのファイルを渡す時は, -fが必要です.

egrepを使う】
~> egrep -f exprs test
egrepを使う; 実行結果】
Beethoven	1770-1827	Symphony No.9
R.Strauss	1864-1949	Also sprach Zarathustra
Bruckner	1824-1896	Symphony No.8
Dvořák	1841-1904	Cello Concerto 
参考文献
      [1] ジョン・マスター, ピーター・バーンズ, UNIXコマンド活用ハンドブック, パーソナルメディア, 1992