grep コマンドはテキストファイル(中身が人間が読むことのできる文字で記述されたファイル)内の文字列を検索するコマンドです。
様々な形で検索できる超便利コマンドですので、是非マスターしておきたいところです。
実環境の実行例を交えながら、オプションの使い方を解説します。
★実行検証環境
Rocky Linux release 8.7 (Green Obsidian)
<目次>
・grep コマンドの構文
・オプション ※順不同
grep -v :指定した検索パターンを含まない(除外した)行を表示する。
grep -n :行番号をつけて表示する。
grep -i :大文字と小文字を区別しないで検索する。
grep -r :ディレクトリ以下のファイルを再帰的に読み込んで検索する。
grep -e :検索パターンをor(または)条件で検索する。
grep -E :検索パターンを拡張正規表現で検索する。
grep -l :検索にマッチしたファイル名のみ表示する。
grep -h :検索結果にファイル名を表示しない。
grep -A :検索にマッチした箇所から後の行を、指定した行数分表示する。
grep -B :検索にマッチした箇所から前の行を、指定した行数分表示する。
grep -C :検索にマッチした箇所の前後に、指定した行数分表示する。
grep -L :検索にマッチしなかったファイルを表示する。
grep -s :エラーメッセージを表示しない。
grep -f :ファイル名で検索する。
grep -w :検索キーワードを単語で指定する。
grep コマンドのよく使うオプションパターン
grep コマンドの構文
grep [オプション] [検索パターン] [検索対象ファイル/ディレクトリ]
grep コマンド実行例
ctfsvというファイルの中から「ab」を含む行を検索する。
検索にマッチした部分が赤くマーキングされる。
[Rockylinux8]# cat ctfsv
1234
abcd
HijK
[Rockylinux8]# grep ab ctfsv
abcd
grep コマンドオプション
grep -v
指定した検索パターンを含まない(除外した)行を表示する。
grep -v オプション実行例
ctfsvというファイルの中から「ij」を含む行を除外して表示する。
[Rockylinux8]# cat ctfsv
1234
abcd
HijK
[Rockylinux8]# grep -v ij ctfsv
1234
abcd
grep -n
行番号をつけて表示する。
Numberのnと覚えるとよい。
grep -n オプション実行例
検索にヒットした行が、何行目にあるのかも表示する。
[Rockylinux8]# cat ctfsv
1234
abcd
HijK
[Rockylinux8]# grep -n K ctfsv
3:HijK
grep -i
大文字と小文字を区別しないで検索する。
grep -i オプション実行例
通常は大文字と小文字は区別されるが、-iオプションで区別がなくなる。
[Rockylinux8]# cat ctfsv
1234
abcd
HijK
[Rockylinux8]# grep -i h ctfsv
HijK
grep -r
ディレクトリ以下のファイルを再帰的に読み込んで検索する。
grep -r オプション実行例
work ディレクトリの中に入っているファイルを全て読み込んで、「iruyo」文字が含まれるファイルとその行を検索する。
「再帰的に読み込む」とは指定したディレクトリ以下のファイルを繰り返し読み込むということ。
[Rockylinux8]# cat /work/pdir/cdir/koredayo
watashiha
kokoni
iruyo
[Rockylinux8]# grep -r iruyo /work
./pdir/cdir/koredayo:iruyo
grep -e
複数の検索パターンをor(または)条件で検索する。
grep -e オプション実行例
「ho」か「4」どちらかを含む行を検索する。
[Rockylinux8]# cat ctfsv2
1234
abcd
HijK
hogehoge
hoge1
[Rockylinux8]# grep -e ho -e 4 ctfsv2
1234
hogehoge
hoge1
grep -E
検索パターンを拡張正規表現で検索する。
grepは通常、正規表現で検索できるが、-Eオプションで拡張正規表現を使用することができる。
拡張正規表現の例)
+ :直前の文字の1回以上の繰り返し
? :直前の文字が0回か1回存在する
{n}:直前の文字がn回存在する
{n,}:直前の文字がn回以上存在する
{n,m}:直前の文字がn回以上、m回以下存在する
grep -E オプション実行例
こんなファイルがあったとします。
[Rockylinux8]# cat ctfsv3
log
logs
+ :直前の文字の1回以上の繰り返し
[Rockylinux8]# grep -E logs+ ctfsv3
logs
? :直前の文字が0回か1回存在する
[Rockylinux8]# grep -E logs? ctfsv3
log
logs
grep -l
検索にマッチしたファイル名のみ表示する。
grep -l オプション実行例
[Rockylinux8]# grep -l log /work/*
/work/ctfsv3
grep -h
検索結果にファイル名を表示しない。
grep -h オプション実行例
オプション無しと比較すると、
[Rockylinux8]# grep log /work/*
/work/ctfsv3:log
/work/ctfsv3:logs
[Rockylinux8]# grep log -h /work/*
log
logs
grep -A
検索にマッチした箇所から後の行を、指定した行数分表示する。
grep -A オプション実行例
[Rockylinux8]# cat ctfsv #こんなファイルがあったとして
grep
コマンド
オプションの
解説記事です。
grep -C
[Rockylinux8]# grep -A 2 "コマンド" ctfsv
コマンド
オプションの #後2行も表示される
解説記事です。
grep -B
検索にマッチした箇所から前の行を、指定した行数分表示する。
grep -B オプション実行例
[Rockylinux8]# cat ctfsv #こんなファイルがあったとして
grep
コマンド
オプションの
解説記事です。
grep -C
[Rockylinux8]# grep -B 2 "解説" ctfsv
コマンド
オプションの #前2行も表示される
解説記事です。
grep -C
検索にマッチした箇所の前後に、指定した行数分表示する。
grep -C オプション実行例
[Rockylinux8]# cat ctfsv #こんなファイルがあったとして
grep
コマンド
オプションの
解説記事です。
grep -C
[Rockylinux8]# gre# grep -C 1 "コマンド" ctfsv
grep #前1行を表示
コマンド
オプションの #後1行を表示
grep -L
検索にマッチしなかったファイルを表示する
grep -L オプション実行例
「ctfsv3」にはlogというテキストが含まれるので、それ以外のファイルが検出される。
[Rockylinux8]# grep -L log /work/*
/work/ctfsv
/work/ctfsv2
grep -s
エラーメッセージを表示しない。
grep -s オプション実行例
オプション無しと比べると、エラーが出なくなる。
[Rockylinux8]# grep log /work/*
grep: /work/700dir: ディレクトリです ⇒これがエラー
/work/ctfsv:log
/work/ctfsv2:logs
[Rockylinux8]# grep -s log /work/*
/work/ctfsv3:log
/work/ctfsv3:logs
grep -f
ファイル名で検索する。
grep -f オプション実行例
ファイル名がマッチしたら、そのファイルの内容を出力する。
[Rockylinux8]# ll
合計 16
-rw-r--r-- 1 root root 67 3月 6 09:38 ctfsv
-rw-r--r-- 1 root root 20 3月 6 10:07 ctfsv2
-rw-r--r-- 1 root root 9 3月 6 10:07 ctfsv3
-rw-r--r-- 1 root root 128 3月 1 22:21 ctfsv4
[Rockylinux8]# grep -f ctfsv ./*
./ctfsv:grep
./ctfsv:コマンド
./ctfsv:オプションの
./ctfsv:解説記事です。
./ctfsv:grep -C
grep -w
検索キーワードを単語で指定する。
grep -w オプション実行例
空白やカンマなどで区切られた「単語」として認識できるキーワードでマッチする。
[Rockylinux8]# cat ctfsv5 #こんなファイルがあったとして
I am shota.
I have 3 cats.
[Rockylinux8]# grep -w have ctfsv5 #これはヒットする
I have 3 cats.
[Rockylinux8]# grep -w a ctfsv5 #これはヒットしない
grep コマンドのよく使うオプションパターン
Linuxの設定ファイルは#から始まるコメント行や、空行が多く含まれています。
特にコメントは長文の説明書きだったり、パラメーターごとに説明のコメントが付いていたりして、それはそれで親切なのですが、実際の設定値が見ずらいという難点があります。
これをうまく取り除いて、設定値だけを抽出するコマンドがこちら。
grep -v -e '^\s*$' -e '^\s*#' <ファイル名>
正規表現の意味はこうなります。
^ :行頭
\s :空白
$ :行末
これを文字列でgrepに引き渡すため、シングルクォート(‘)で囲みます。
こうすることで、空行と、#から始まる行(#の前にスペースなどがあっても可)を除外してくれます。
オプション実行例
[Rockylinux8]# cat ctfsv4
#これは宣伝です。
CTFパソコン教室です。
生徒募集中。
#これはコメント
#これもコメント
[Rockylinux8]# grep -v -e '^\s*$' -e '^\s*#' ctfsv4
CTFパソコン教室です。
生徒募集中。
最後に
grepはオプションが多く、正規表現の辺りがちょっと悩むかもしれません。
ただ使いこなせるとかなり便利なコマンドですので、是非マスターしてください。
すべてを暗記するのが難しければ、「たしかあんなことできたよな?」と思い出して調べるでもいいと思います。
機能を知っているか知らないかの差も大きいですからね。
その他基本的なコマンドの使い方はこちらをごらんください。