RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

【Linux】今日から使えるgrepコマンド

はじめに

皆さんこんにちは、開発課のthree_yagiです。
現在の業務では不具合などが発生したときの原因調査を担当することが多く、本番環境のログの調査をよく行っています。

Linux上に存在するログを調査するにあたって、必須ともいえるのが文字列検索を行う grep コマンドです。
こちらの記事では、grep コマンドについて私が実務でよく使っている検索方法と併せて紹介していきます。

目次

grep コマンドの基本

grep検索対象のファイルから指定した文字列を含む行を表示するLinuxコマンドです。
正規表現とオプションを駆使することで様々な条件での検索が行えます。

基本構文

$ grep [オプション] 検索文字列 対象ファイル

よく利用するオプションと正規表現

実際によく利用しているオプションについて記載します。
これらを使いこなせれば一通りの検索はできるかなと思います。

オプション

オプション 説明
-E 拡張正規表現(ERE)を利用する
※このオプションなしでも正規表現の「. * ^ $ [ ]」は利用可能
-e [検索文字列] オプションの引数として検索文字列を指定する
このオプションを複数回使用することでOR検索が可能
-v 結果を反転する。検索文字列を含む行以外を表示
-i 検索文字列の大文字と小文字を区別しない
-c マッチした行ではなく、マッチした行数を表示
-m [数字] [数字]行分だけ表示する
-B [数字] マッチした行の前 [数字] 行を表示
-A [数字] マッチした行の後 [数字] 行を表示
-C [数字] マッチした行の前後 [数字] 行を表示
-h 出力する行の前にファイル名を付けないようにする
-n 頭にそのファイル内での行数を表示

正規表現

正規表現を利用することで柔軟な検索ができるようになります。
拡張正規表現の列が「〇」の正規表現はオプションで「-E」を指定する必要があります。

正規表現 意味 拡張正規表現
. 任意の 1 文字
* 直前の 1 文字または パターンが 0 回以上繰り返す
^ 行の先頭を表す
$ 行の末尾を表す
[ ] 括弧内の任意の 1 文字が存在する
( ) パターンのグループ化
+ 直前の 1 文字 または パターンが 1 回以上繰り返す
? 直前の 1 文字 または パターンが 0 回または 1 回だけ存在
{n} 直前の 1 文字 または パターンが n 回繰り返す
| 2 パターンのうちどちらか片方

利用例(基本編)

実際の利用例を見ながら利用方法について確認してみましょう。

検索対象のテストファイル(test.txt)には都道府県がローマ字で記載されたファイルを使用しています。

# テスト用ファイル
$ cat test.txt
hokkaido
aomori
iwate
miyagi
akita
yamagata
︙
miyazaki
kagoshima
okinawa

基本の検索

まずは単純に指定した文字列を含む行を表示してみます。

# 【検索条件】'yama' を含む行を表示
$ grep 'yama' test.txt
yamagata
toyama
yamanashi
wakayama
okayama
yamaguchi

AND検索

grepの結果を|(パイプ)でつなぐことで1つ目のgrepの検索結果に再度grepをかけることになり、AND検索が可能です。

# 【検索条件】'yama' と 'oka'を含む行を表示
$ grep 'yama' test.txt | grep 'oka'
okayama

OR検索

OR検索はオプションの「-e」を使って検索文字を複数指定する方法と、正規表現を利用する方法があります。
正規表現を利用する場合は拡張正規表現の「|」を使用するので、オプション「-E」を指定する必要があります。
どちらも結果は同じになるのでお好きな方を利用してください。

# 【検索条件】'yama' または 'oka' を含む行を表示

# 「-e」を使ってOR検索
$ grep -e 'yama' -e 'oka' test.txt

# 正規表現でOR検索
$ grep -E 'yama|oka' test.txt

# 結果は同じ
yamagata
toyama
yamanashi
shizuoka
wakayama
okayama
yamaguchi
fukuoka

NOT検索

○○を含む行以外を検索したい場合は、検索結果を反転する「-v」オプションを利用します。

#【検索条件】 'yama'を含まない行を表示
$ grep -v 'yama' test.txt
hokkaido
aomori
iwate
miyagi
akita
fukushima
ibaraki
⁝

複数指定する場合

#【検索条件】 'yama' と 'oka'を含まない行を表示
# OR検索の結果を「-v」で反転させればどちらも含まない行を表示できます
$ grep -v -e 'yama' -e 'oka' test.txt
$ grep -v -E 'yama|oka' test.txt
(結果省略)

大文字と小文字を区別しないで検索

デフォルトでは文字の大文字と小文字を区別した状態で検索を実行します。
大文字と小文字を区別せずに検索する場合は「-i」オプションを利用します。

# オプションなしだと'Yama'を含む行しか対象とならないのでいずれの行も出力されません
$ grep 'Yama' test.txt

# オプションありだと'yama'も対象となるので結果が出力されます
$ grep -i 'Yama' test.txt
yamagata
toyama
⁝

マッチした行数を表示

「-c」オプションを用いることで検索結果の行ではなく行数が表示されます。

#【検索条件】'yama'を含む行の合計の行数を表示
$ grep -c 'yama' test.txt
6

マッチした行のうち〇行だけ表示

「-m」オプションで結果を表示する行数を指定できます。

#【検索条件】'yama'を含む行のうち頭から2行分だけ表示
$ grep -m 2 'yama' test.txt
yamagata
toyama

マッチした行の前後の行も表示する

「-B」「-A」「-C」オプションを利用することでマッチした行の前後の行も表示できます。
「-B」「-A」で前と後それぞれの表示する行数を指定でき、「-C」で前後まとめて行数を指定できます。
ログを調査する際にはよく使うオプションです。

#【検索条件】 'tokyo' を含む行を前後1行も含めて表示

# 「-B」「-A」で前後それぞれ指定
$  grep -B 1 -A 1 'tokyo' test.txt

# 「-C」でまとめて指定
$ grep -C 1 'tokyo' test.txt
chiba
tokyo
kanagawa
#【検索条件】 'tokyo' を含む行を前3行,後2行も含めて表示
$ grep -B 3 -A 2 'tokyo' test.txt
gunma
saitama
chiba
tokyo
kanagawa
niigata

正規表現で様々な条件で検索する

#【検索条件】'〇a〇a〇a'という文字列を含む行を表示
# '.'は任意の1文字
$ grep  '.a.a.a' test.txt
yamagata
kanagawa
yamanashi
wakayama
okayama
kagawa
nagasaki

# こちらも同じ条件での検索となる
# '( )' グループ化
# '{n}'直前の文字のn回の繰り返し
$ grep -E '(.a){3}' test.txt
#【検索条件】'a'で始まる行を表示
# `^`は行頭を意味する
$ grep '^a' test.txt
aomori
akita
aichi
#【検索条件】'a'で始まり先頭以外にも'a'を含む行を表示
# '*'は直前の文字の0回以上の繰り返し
# '.'と組み合わせた '.*' は任意の0 or n文字を表す
$ grep '^a.*a' test.txt
akita

利用例(応用編)

grepした文字をハイライト表示

--color=alwaysで検索した文字列に色を付けることができます。
検索結果が大量のときや、正規表現で検索していてどこからどこまでがマッチしているか確認したいときなどに便利です。

$ grep --color=always -E '(.a){3}' test.txt

このように表示されます

圧縮ファイルをgrepする

ログファイルなどは圧縮された状態で保存されていることが多いかと思います。
圧縮されたファイルに対してはzgrepコマンドを利用することでgrepと同じように検索できます。
grepと同じオプションや正規表現も利用でき、使用方法としてはgrepと同じになります。

$ zgrep -i 'Yama' test.gz

grepコマンド まとめ

grepコマンドはLinuxを利用するにあたって必須ともいえるコマンドです。
使いこなせるようになればファイルの検索などのスピードが劇的にアップします。
今回紹介したのは一部のオプション、正規表現となります。
他にも有用なものはたくさんあるのでぜひご自身で調べてみてください。

Linuxの理解をより深めたい方へ以下関連おすすめブログ
ls コマンド 【使い方 まとめ】
よく使うLinuxコマンド一覧【最新版】
sar コマンド【使い方 まとめ】
iptables まとめ【Linux ファイアウォール】
sed コマンド【使い方 まとめ】
vi コマンド【使い方まとめ】
Linuxのファイル操作でよく使うLinuxコマンド
初心者のためのawkコマンド
実務で使える!基本的なシェル(Linux)コマンドの話 ~forとsed~
【Linux】今振り返りたい、プロセスって何?


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.