1. ホーム
  2. コース一覧
  3. Linux基礎コース(パート2)
  4. Linuxコマンド[grepと正規表現]

Linux基礎コース(パート2)2/9

Linuxコマンド[grepと正規表現]

こちらの記事では、grepコマンドと正規表現について解説します。

grepはファイルやテキストストリーム内を検索する際に利用するコマンドです。 より効果的に利用するためには、その機能をしっかりと理解しておくことが重要です。

grepコマンド

grepコマンドはファイル内の文字列やテキストストリームに対して、特定のパターンに合致するものがあるかどうかを調べるときに使用するコマンドです。

  • パイプ(|)を使って他のコマンドと組み合わせて使用
  • 正規表現を使って文字のパターンを指定して検索

といった機能も利用できます。

なおgrepは「global regular expression print」の略です。

基本構文

grep 【オプション】 パターン 【ファイル名】
  • 基本の文字列検索
  • ディレクトリ内の検索
  • and検索

について解説します。

基本的な使用方法

基本となる文字列検索には、以下のコマンドを実行します。

grep 検索文字列 【ファイル名】

まずは簡単な検索をしてみましょう。 ファイルの中身は、以下のとおりです。

cat sample.txt
red
blue
yellow
green
orange

このsample.txtファイルに対してrを含む文字列を検索する場合、以下のように入力します。

grep r sample.txt
red
green
orange

検索した文字列が存在する場合は、検索対象の文字列が表示されます。 以下、他の文字による検索例です。

lを含む文字列を検索する場合

grep l sample.txt
blue
yellow

blueを含む文字列を検索する場合

grep blue sample.txt
blue

ディレクトリ内の検索

ファイル名の代わりにディレクトリを指定することで、指定ディレクトリ及びそのサブディレクトリ内のすべてのファイルから検索が行われます。

grep 検索文字列 【ディレクトリ名】/*

以下のsample2.txtファイルを追加します。 中身は以下のとおりです。

cat sample2.txt
apple
banana
watermelon

カレントディレクトリ直下に存在しているファイルからrを含む文字列を検索する場合、以下のように入力します。

#カレントディレクトリを指定
grep r ./*
./sample.txt:red
./sample.txt:green
./sample.txt:orange
./sample2.txt:watermelon

ディレクトリ内を検索した場合、ファイル名も含めて検索結果が表示されます。

パイプ(|)でand検索

| grep 検索文字列 を追記することで、パイプ(|)を使ってand条件による検索が行えます。

grep 検索文字列 【ファイル名】 | grep 検索文字列

sample.txtファイルに対してbを含む、かつ(and) u を含む文字列検索する場合、以下のように入力します。

# bとuを含む文字列を検索
grep b sample.txt | grep u
blue

grepのオプション

grepには多くの便利なオプションが用意されています。先ほど使った sample.txt でいくつかのオプションを使用した例を見てみましょう。

cat sample.txt
red
blue
yellow
green
orange
GreeeeN # 追加

--help

--help オプションを使用すると、利用可能なオプションの一覧を確認できます。

grep --help

Pattern selection and interpretation:
  -E, --extended-regexp     PATTERN is an extended regular expression
  -F, --fixed-strings       PATTERN is a set of newline-separated strings
  -G, --basic-regexp        PATTERN is a basic regular expression (default)
  -P, --perl-regexp         PATTERN is a Perl regular expression
  -e, --regexp=PATTERN      use PATTERN for matching 
  -f, --file=FILE           obtain PATTERN from FILE 
# 中略

-e (--regexp=)

OR条件での検索を行いたい場合に使用します。

# "b"または"l"を含む文字列を検索
grep -e b -e l sample.txt
blue
yellow

-i (--ignore-case)

大文字小文字の区別をせずに検索できます。

# 大文字小文字問わない"g"を含む文字列の検索
grep -i g sample.txt
green
orange
GreeeeN   # 大文字も表示される

-v (--invert-match)

指定した文字列以外の文字列を検索するときに使います。

# "blue"以外の文字列を検索
grep -v blue sample.txt
red
yellow
green
orange
GreeeeN

-o (--only-matching)

検索結果に一致した箇所だけを表示します。

# "re"を含む文字列を検索し合致箇所のみを表示
# red/green/GreeeeNの"re"のみが表示される
grep -o re sample.txt
re
re
re

-C (--context)

検索結果の前後の行数を指定し、表示します。

(基本構文)

grep -C 行数  パターン 【ファイル名】

(実行例)

# "green"を検索し、合致した行の前後1行も表示する
grep -C 1 green sample.txt
yellow
green
orange

なお、「前の行だけ」や「後ろの行だけ」を表示するオプションもあります。

-A(--after-context=)

検索結果の後の行数を指定し、表示します。

# "green"を検索し、合致した行の後1行も表示する
grep -A 1 green sample.txt
green
orange

-B(--before-context=)

検索結果の前の行数を指定し、表示します。

# "green"を検索し、合致した行の前1行も表示する
grep -B 1 green sample.txt
yellow
green

-n (--line-number)

検索結果に行番号を表示します。

# "r"を含む文字列を行番号を表示して検索
grep -n r sample.txt
1:red
3:green
4:orange
5:GreeeeN

-c(--count)

検索結果の行数のみを表示します。

# "r"を含む文字列の行数のみを表示
grep -c r sample.txt
4

-l (--files-with-matches)

検索結果にファイル名のみを表示します。

# rを含む文字列に合致したファイル名を検索
grep -l r ./*
./sample.txt
./sample2.txt

(参考:-lオプションを指定しなかった場合の実行結果)

grep r ./* 
./sample.txt:red
./sample.txt:green
./sample.txt:orange
./sample.txt:GreeeeN 
./sample2.txt:watermelon

-L (--files-without-match)

該当しなかったファイル名を表します。

# dを含む文字列に合致しなかったファイル名を検索
grep -L d ./*
./sample2.txt

(参考:-Lオプションを指定しなかった場合の実行結果)

grep d ./*
./sample.txt:red

-h (--no-filename)

検索結果にファイル名を表示しないオプションです。

# カレントディレクトリ内の"r"を含む文字列をファイル名非表示で検索
grep -h r ./* 
red
green
orange
GreeeeN 
watermelon

(参考:-hオプションを指定しなかった場合の実行結果)

grep r ./*
./sample.txt:red
./sample.txt:green
./sample.txt:orange
./sample.txt:GreeeeN 
./sample2.txt:watermelon

-r (--recursive)

ディレクトリ内のすべてのファイル(サブディレクトリ内のファイルも含む)を検索対象にするためのオプションです。

以下のようなディレクトリ構成を想定しています。

(カレントディレクトリ)
├── sample.txt
├── sample2.txt
├── test
     └── sample3.txt

sample3.txtファイルの中身は以下のとおりです。

cat ./test/sample3.txt
abc
def
ghi
opqr

-r オプションを指定した場合、カレントディレクトリ内に存在するtestディレクトリ内のファイルも検索対象となります。

grep -r r ./*
./sample.txt:red
./sample.txt:green
./sample.txt:orange
./sample.txt:GreeeeN 
./sample2.txt:watermelon
./test/sample3.txt:opqr

(参考:-rオプションを指定しなかった場合の実行結果)

-r オプションを指定しない場合、カレントディレクトリ直下のファイルしか検索されません。

# sample3.txtは検索されず、opqrが表示されない
grep r ./*
./sample.txt:red
./sample.txt:green
./sample.txt:orange
./sample.txt:GreeeeN 
./sample2.txt:watermelon
grep: ./test: Is a directory

-E(--extended-regexp)

拡張正規表現で検索を行えます。 ()*+?{|などの記号をエスケープなしで使用できるようになります。

# bとuを含む文字列を拡張正規表現を用いて検索する
grep -E 'b|u' sample.txt
blue

(参考:-Eオプションを指定せず、基本正規表現を使う場合)

# 'b'または'u'を含む行を基本正規表現で検索する(\\でエスケープする必要がある)
grep  'b\|u' sample.txt
blue

他のコマンドとの同時実行

パイプラインを利用すると、他のコマンドと組み合わせて使用できます。

コマンド | grep 検索したい文字

ls コマンドと組み合わせると、 ls コマンドの出力(指定したディレクトリ内のファイル名)から特定の文字列を検索できます。

ls | grep sample
sample.txt
sample2.txt
# lsコマンドの出力(testディレクトリ内のファイル名)から、「sample」を含む行(ここではファイル名)を検索
ls test | grep sample
sample3.txt

正規表現を使った検索

正規表現を使うと、より複雑な検索ができるようになります。

正規表現とは

正規表現とは、様々な文字列のパターンを一つの表現式で表現する手法です。複雑なパターンの検索や、特定の条件に一致する複数のパターンを一度に検索したい時に便利です。以下に代表的なものを紹介します。

正規表現意味合い
[a-z]範囲内(ここではaからz)の任意の一文字が当てはまる
[^あ-お ]範囲内(ここでは「あ」から「お」)以外の任意の一文字が当てはまる
\直後の正規表現を文字列として扱う
^直後の文字が先頭にある
$直前の文字が末尾にある

正規表現を使ったgrep

先ほど使用したsample.txtで例を見てみましょう。

cat sample.txt
red
blue
yellow
green
orange
# 行の先頭が "bl" から始まる文字列の検索
grep ^bl sample.txt
blue
# 行末が "ge" で終わる文字列の検索
grep e$ sample.txt
orange
# "a"から"d"までのいずれかの文字を含む文字列の検索
grep [a-d] sample.txt
red
blue
orange

複数の正規表現を組み合わせたgrep

正規表現を組み合わせて使うこともできます。

# 行の先頭が "a"から"g"までのいずれかの文字から始まる文字列の検索
grep ^[a-g] sample.txt
blue
green

# 行の先頭が "a"から"g"までの文字以外で始まる文字列の検索
grep ^[^a-g] sample.txt
red
yellow
orange

まとめ

今回はgrepコマンドと正規表現について学びました。Linuxでは絞り込み検索など必要になる場面が多々出てきますので、基本的な使い方をしっかり押さえて、コマンドと組み合わせたり、正規表現を使いこなして検索時間を短縮できるようになりましょう。

また、正規表現はプログラミング言語でも用いられる内容ですので、これを機にいろいろと調べたり実践したりして使いこなせるようになりましょう。

問題を解くためには、十分な画面サイズのPC環境をご利用下さい。