Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

grep

ファイル内の文字列を検索する
2015/05/20 08:00

対応OS: linux , freebsd, solaris
grep [-c] [-v] [-d ACTION] [-A NUM] [-B NUM]
[-C[NUM]] [-a] [-b] [-E] [-F] [-H] [-h] [-I] [-i]
[-L] [-l] [-n] [-x] {[-e] PATTERN|[-f FILE]} [FILE...]

 

 grepコマンドは、FILE...に指定したファイルの内容を読み込み、PATTERNに指定した文字列を含む行、あるいは含まない行を検索して、オプションに従って編集して出力します。

オプション
① -c
PATTERNに指定した文字列を含む行の行数を出力します。
② -v
PATTERNに指定した文字列を含まない行を出力します。
③ -d ACTION

FILE...にディレクトリを指定した場合またはワイルドカードなどを使いディレクトリを含む複数個指定をした場合に、「ACTION」に指定する値によって、以下の動作を行います。FILE...にディレクトリを含まない場合、このオプションは意味を持ちません。

 read : ディレクトリをgrepコマンドの対象として普通のファイルであるかのように読み込んで処理する

 skip : ディレクトリをgrepの対象外とする

 recurse: ディレクトリ下のすべてのファイルを読み込む

④ -A NUM
出力結果に、「NUM」で指定した行数だけ後の行を付加します。例えば、「-A 2」と指定した場合、10行目を出力する際に10行目と11行目と12行目を出力します。
⑤ -B NUM
出力結果に、「NUM」で指定した行数だけ前の行を付加します。例えば、「-B 2」と指定した場合、10行目を出力する際に8行目と9行目と10行目を出力します。
⑥ -C[NUM]
出力結果に、「NUM」で指定した行数だけ前後の行を付加します。例えば、「-C1」と指定した場合、10行目を出力する際に9行目と10行目と11行目を出力します。「NUM」を省略した場合は「2」を指定したことになります。
注意

 「-C」とその後の行数を表す数字の間にはスペースを入れてはいけません。

⑦ -a
FILE...にバイナリファイルを指定した場合に、テキストファイルであるかのように処理します。
⑧ -b
各出力行の前に、入力ファイルの先頭からのバイト単位のオフセットを出力します。
⑨ -E
PATTERNに指定した文字列をパターン文字列として、正規表現での検索を行います。
⑩ -F
PATTERNに指定した文字列を、改行で区切って固定文字列のリストとして扱います。リストに含まれる文字列のいずれかと一致するかを検索します。
⑪ -H
FILE...にひとつのファイルを指定した場合に、その行が含まれるファイル名を付加します。デフォルトでは、ひとつのファイルを指定した場合は、ファイル名は表示されません。このオプションは、FILE...に複数のファイルを指定した場合はデフォルトと同じ動作となり意味を持ちません。
⑫ -h
複数のファイルを検索した時に、出力の前にファイル名を付けません。デフォルトでは、複数のファイルが検索対象となった場合は、出力結果にファイル名を付加します。このオプションは、FILE...にひとつのファイルを指定した場合はデフォルトと同じ動作となり、意味を持ちません。
⑬ -I
FILE...に指定したバイナリファイルを無視します。
⑭ -i
FILE...に指定したファイルの内容から、PATTERNで指定した文字列を、大文字と小文字の区別をせずに検索します。
⑮ -L
出力する行のないファイル名をひとつだけ出力します。
⑯ -l
出力する行があるファイル名をひとつだけ出力します。
⑰ -n
各出力行の前に、その行のファイル内での行番号を出力します。
⑱ -x
行全体が正確に一致する行のみを検索します。
⑲ -e
PATTERNに指定した文字列をパターンとして強制的に認識させます。例えば、パターン文字列に「-a」を指定したい場合に、通常であれば、grepコマンドは「-a」をオプションと解釈してしまいます。このとき「-e -a」とすることによって、「-a」がパターンであることをgrepコマンドに伝えることができます。
⑳ -f FILE
検索する文字列(パターン)を、「FILE」に指定したファイルから1行ごとに読み込みます。つまり、改行区切りのパターンリストを「FILE」に指定したファイルに事前に作成しておく必要があります。1行の中にスペース区切りの文字列があっても、それはスペースを含むパターンとして認識されます。
HINT!

 オプションを指定しなければ、PATTERNに指定した文字列を含む行を出力します

オフセット

 オフセットとは、位置を表すために、ある基点から単位量移動したところという表現で表す方法です。grepコマンドの実行時にオプション「-b」を指定すると、ファイルの先頭文字を基点(1とする)としてパターンと一致する場所が何バイト目にあるかを示します

引数
① PATTERN
検索する文字列あるいはパターンを指定します。
② FILE...
検索するファイルをスペースで区切って指定します。ワイルドカードによる指定も可能です。省略すると、標準入力からの入力になります。
ファイルから特定の文字列を含む行を表示する
[takeda]$ grep takeda /etc/passwd 
ファイル「/etc/passwd」の内容から「takeda」を含む行を表示
takeda1:x:500:500::/home/takedak:/bin/bash
takeda:x:502:502::/home/takeda:/bin/bash
[takeda]$ grep -c takeda /etc/passwd
オプション「-c」を付けると行数を表示
2
[takeda]$
ファイルから特定の文字列を含み、別の特定の文字列を含まない行を表示する
[takeda]$ grep takeda /etc/passwd | grep -v takeda1 
パイプを使って「takeda」を含み、「takeda1」を含まない行を表示
takeda:x:502:502::/home/takeda:/bin/bash
[takeda]$ grep -b takeda /etc/passwd
[takeda]$
ディレクトリを無視して検索する
[takeda]$ ls -l 
合計8
-rw-rw-r-- 1 cmd cmd 98 7月15 18:02 command
drwxrwxr-x 2 cmd cmd 4096 7月15 17:12 dir01
「dir01」はディレクトリ
[takeda]$ grep -d skip b *
FILE...にアスタリスク(*)を指定しても、オプション「-d skip」を指定すると、ディレクトリを検索しない
command:b01
command:b02
command:b03
command:b04
[takeda]$
出力結果に前後の行を含める
[takeda]$ cat code 
cd0010001
Take
16400
cd0010002
hama
17700
cd0020001
mae
12000
cd0010003
naka
16700
ファイル「code」の内容
[takeda]$ grep -A 2 cd0010001 code
ファイル「code」の内容から「cd0010001」を含む行を検索して、後に続く2行も表示
cd0010001
Take
16400
[takeda]$ grep -B 2 17700 code
ファイル「code」の内容から「17700」を含む行を検索して、その前の2行も表示
cd0010002
hama
17700
[takeda]$ grep -C1 naka code
ファイル「code」の内容から「naka」を含む行を検索して、その前後各1行も表示
cd0010003
naka
16700
[takeda]$
正規表現を使って検索する
[takeda]$ cat command 
grep確認用のファイル
111
222
333
444
555
666
777
888
999
000
a01
a02
a03
a04
a05
b01
b02
b03
b04
ファイル「command」の内容
[takeda]$ grep -E [3a] command
オプション「-E」を指定して、「3」または「a」のいずれかを含む行を、正規表現を使って検索
333
a01
a02
a03
a04
a05
b03
[takeda]$
HINT!

 lsコマンド・catコマンド

正規表現

 正規表現とは、ワイルドカードに代表されるような特殊な文字を使用してある規則を表し、複数の文字列をひとつの表記(パターン文字列)で表す方法です。正規表現の規則は多少複雑で難解な部分もありますので中級/上級者向けといえますが、正規表現を使うことでコマンド入力の幅が広がりますので、簡単にその概要を説明します。

 正規表現では、「[」と「]」で囲まれた文字のリストが、そのリストに含まれるいずれか1文字を表します。逆に、リストの先頭に「^」(キャレット)を付けると、そのリストに含まれない任意の1文字を表します。例えば、「[0123456789]」は、1文字の任意の数字を表します。逆に「[^0123456789]」は、数字以外の任意の1文字を表します。

 また、2つの文字をハイフン(-)でつないで文字の範囲を指定することもできます。文字の範囲とは、文字コードの範囲のことです。もう少し噛み砕いていえば、最初の文字の文字コード以上で、最後の文字の文字コード以下の文字コードを持つ任意の1文字を表すことができるということです。例えば、「[A-Z]」は任意の1文字の大文字アルファベットを表します。「[0123456789]」は「[0-9]」と表すこともできるわけです。

 その他、ピリオド(.)は、文字の種類などにかかわらず任意の1文字に一致します。キャレット(^)と、ドル記号($)は、それぞれ行頭と行末を表します。例えば「^start.*end$」は、「start」で始まり「end」で終わる行を表します。この時アスタリスク(*)は、直前の「.」が表すパターンを0回以上繰り返すことを表します。つまり、「.*」で0文字以上の任意の文字列を表します。このように、直前のパターンを特定の回数繰り返す表現として以下のものがあります。

 ? :直前のパターンを0回または1回繰り返す

 * :直前のパターンを0回以上繰り返す

 + :直前のパターンを1回以上繰り返す

 {n} :直前のパターンをn回繰り返す(「n」には0以上の整数を指定)

 {n,} :直前のパターンをn回以上繰り返す(「n」には0以上の整数を指定)

 {n,m}:直前のパターンをn回以上m回以下繰り返す(「n」および「m」には0以上の整数を指定)

 複数のパターン文字列を連結することも可能です。例えば「[0-9][^0-9]」は、任意の1文字の数字に、数字以外の任意の1文字が続く文字列を表します。また、複数のパターン文字列を「|」で連結すると、いずれかのパターンに一致することを表します。

 このように正規表現では、「[」や「*」などが特殊な意味を持つことで、さまざまなパターン文字列を形成します。これらの文字のことをメタ文字といいます。そして、メタ文字を直接指定するには、それらの文字の前にバックスラッシュ(\)を付けます。このバックスラッシュのことをエスケープ文字といいます。正規表現ではパターン文字列に合致する(マッチする)文字列を検索し、このことをパターンマッチングといいます。

関連タグ

UNIXコマンド辞典トップページに戻る

All contents copyright © 2006-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5