LinuC Level1 v10.0 対策コース(パート1)31/39
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環境をご利用下さい。