__grepコマンドとは__
ファイルの中の特定の文字列(パターン)がある行を抽出するコマンド
Linuxコマンドの中で最もよく使うコマンドの1つ
基本書式
grep [オプション] 検索パターン ファイル名 [ファイル名] #ファイル名は複数指定できる
もしくは
コマンド | grep [オプション] 検索パターン
※[]は省略可
オプション
●検索関連のオプション
オプション | 意味 | サンプルコード |
---|---|---|
-E | 検索に拡張正規表現を使う | 使用例1 |
-i | 大文字と小文字を区別せずに検索する | 使用例2 |
-P | 検索にPerl正規表現を使う | 使用例3 |
-x | 行全体がパターンと一致するものを検索する | 使用例4 |
●表示関連のオプション
オプション | 意味 | サンプルコード |
---|---|---|
-A 行数 | 一致した行の後の行も表示する | 使用例5 |
-b | パターンの前に何文字あるかを併せて表示する | 使用例6 |
-B 行数 | 一致した行の前の行も表示する | 使用例7 |
-c | 一致するものが含まれている回数のみ表示 | 使用例8 |
-C 行数 | 一致した行の前後の行も表示する | 使用例9 |
-h | ファイル名を表示しない(複数ファイル指定時) | 使用例10 |
-H | ファイル名を併せて表示する | 使用例11 |
-l | 一致するものが含まれているファイルのファイル名のみ表示する | 使用例12 |
-L | 一致するものが含まれていないファイルのファイル名のみ表示する | 使用例13 |
-m 回数 | パターンと一致するものを含む行が指定した数に達したら処理を終了する | 使用例14 |
-n | 行番号を併せて表示する | 使用例15 |
-o | 一致した箇所だけを表示する | 使用例16 |
-q | 結果を表示しない(主にシェルスクリプトなどで判定用に使う) | 使用例17 |
-v | パターンに一致しない行を表示する | 使用例18 |
●検索対象関連のオプション
オプション | 意味 | サンプルコード |
---|---|---|
-r | ディレクトリを指定した場合はサブディレクトリ内のファイルも含めて検索する | 使用例19 |
-R | サブディレクトリも含めて検索、さらにシンボリックリンクの先 | 使用例20 |
####基本使用例
#/etc/passwdファイルの中身を「hoge」で検索する場合
grep hoge /etc/passwd
実行結果
hoge:x:1000:1000::/home/hoge:/bin/bash #「hoge」が含まれる行が表示される
#コマンドの実行結果について任意のパターンを検索する場合
cat /etc/passwd | grep HOGE
実行結果
HOGE:x:1001:1001::/home/HOGE:/bin/bash #コマンドの実行結果から「HOGE」が含まれる行だけが表示される
##「cat /etc/passwd」のみだと下記のような実行結果(ファイルの中身を全て表示する)
root:x:0:0::/root:/bin/bash
・
・
・
hoge:x:1000:1000::/home/hoge:/bin/bash
HOGE:x:1001:1001::/home/HOGE:/bin/bash
・
・
・
#複数のファイルを指定して検索する場合
/etc/test.txt
aaa
bbb
ccc
ddd
eee
fff
/etc/test1.txt
aaa
aaa
bbb
aaa
bbb
ccc
grep aaa /etc/test.txt /etc/test1.txt
実行結果
test.txt:aaa
test1.txt:aaa
test1.txt:aaa
test1.txt:aaa
#/etc/passwdファイルの中身を正規表現で検索する場合
grep ^h... /etc/passwd
実行結果
halt:x:7:0:halt:/sbin:/sbin/halt #最初に「h」から始まる4文字の単語が含まれる行が表示される
hoge:x:1000:1000::/home/hoge:/bin/bash #正規表現の詳細については別ページ参照
####使用例1
検索に拡張正規表現を使う
#/etc/sysconfig/network-script/enp0s3ファイルの中身を拡張正規表現で検索
grep -E "((25[0-5]|1[0-9][0-9]|[0-9]?[0-9])\.){3}(25[0-5]|1[0-9][0-9]|[0-9]?[0-9])" /etc/sysconfig/network-scripts/ifcfg-enp0s3
実行結果
IPADDR=192.168.0.2 #IPアドレスが含まれる行が表示される
GATEWAY=192.168.0.1
DNS1=8.8.8.8
####使用例2
大文字と小文字を区別せずに検索する
#/etc/passwdファイルの中身を大文字・小文字の区別なく「hoge」で検索
grep -i hoge /etc/passwd
実行結果
hoge:x:1000:1000::/home/hoge:/bin/bash #大文字・小文字関係なく、「hoge」と「HOGE」のどちらでも含まれる行が表示される。
HOGE:x:1001:1001::/home/HOGE:/bin/bash #「Hoge」や「hogE」を含む行があれば、その行も表示される
####使用例3
Perl正規表現を使って表現する
#/etc/httpd/conf/httpd.confファイルの中身をPerl正規表現を使って検索
grep -P "\d" /etc/httpd/conf/httpd.conf #数字が含まれる行が表示されるように検索
実行結果
# See <URL:http://httpd.apache.org/docs/2.4/> for detailed infomation.
# <URL:http://httpd.apache.org/docs/2.4/mod/directives.html>
・
・
・
####使用例4
行全体がパターンと一致する行があるか検索する
#行全体がパターンと一致する行が含まれているか確認する場合
grep -x IPADDR=192.168.0.2 /etc/sysconfig/network-scripts/ifcfg-enp0s3
実行結果
IPADDR=192.168.0.2 #行全体がパターンと一致する行のみ表示される
##grep -x IPADDR= /etc/sysconfig/network-scripts/ifcfg-enp0s3 と実行した場合
実行結果なし #行全体がパターンと一致する行が無いと何も表示されない
####使用例5
一致した行の後の行も表示する
#/etc/test.txtをAオプションで検索する場合
/etc/test.txt
1 aaa
2 bbb
3 ccc
4 ddd
5 eee
6 fff
grep -A1 ccc /etc/text.txt
実行結果
3 ccc #パターンと一致した3行目と1つ後の4行目が表示される
4 ddd
grep -A2 ccc /etc/text.txt
実行結果
3 ccc #パターンと一致した3行目と後ろの4行目と5行目が表示される
4 ddd
5 eee
####使用例6
パターンの前に何文字あるかを併せて表示する
#/etc/test.txtをbオプションで検索する場合
/etc/test.txt
1 aaa
2 bbb
3 ccc
4 ddd
5 eee
6 fff
grep -b fff test.txt
実行結果
20:fff #パターンと一致した文字列の前に何文字あるかを一緒に表示される(改行や空白も1文字に含まれる)
####使用例7
一致した行の前の行も表示する
#/etc/teat.txtをBオプションで検索する場合
/etc/test.txt
1 aaa
2 bbb
3 ccc
4 ddd
5 eee
6 fff
grep -B1 fff /etc/test.txt
実行結果
5 eee #パターンと一致した6行目とその前の5行目が表示される
6 fff
grep -B2 fff /etc/test.txt
実行結果
4 ddd #パターンと一致した6行目とその前の4行目と5行目が表示される
5 eee #「-B」の後の数字で何行前まで表示するか決められる
6 fff
####使用例8
パターンと一致したものが含まれる行の行数のみを表示する
#/etc/test1.txtをcオプションで検索する場合
/etc/test1.txt
1 aaa
2 aaa
3 bbb
4 aaa
5 bbb
6 ccc
grep -c aaa /etc/test1.txt
実行結果
3 #パターンと一致したものが含まれる行の行数のみ表示
####使用例9
一致した行の前後の行も表示する
#/etc/test.txtをCオプションで検索する場合
/etc/test.txt
1 aaa
2 bbb
3 ccc
4 ddd
5 eee
6 fff
grep -C1 eee /etc/test.txt
実行結果
4 ddd #パターンと一致した5行目とその前後の4行目と6行目が表示される
5 eee
6 fff
grep -C2 ddd /etc/test.txtで検索
実行結果
2 bbb #パターンと一致した4行目とその前後の2行目、3行目、5行目、6行目が表示される
3 ccc #「-C」の後の数字で前後何行目まで表示するかを決められる
4 ddd
5 eee
6 fff
####使用例10
ファイル名を表示しない(複数のファイルを検索した場合のみ)
#/etc/test.txtと/etc/test1.txtをhオプションで検索する場合
/etc/test.txt
aaa
bbb
ccc
ddd
eee
fff
/etc/test1.txt
aaa
aaa
bbb
aaa
bbb
ccc
grep -h aaa /etc/test.txt /etc/test1.txtで検索
実行結果
aaa #ファイル名が表示されない
aaa
aaa
aaa
####使用例11
ファイル名も併せて表示される
#/etc/test.txtをHオプションで検索する場合
/etc/test.txt
1 aaa
2 bbb
3 ccc
4 ddd
5 eee
6 fff
grep -H aaa /etc/test.txt
実行結果
test.txt:aaa #ファイル名が表示される
####使用例12
一致するものが含まれているファイルのファイル名のみ表示する
#/etc/test.txtと/etc/test1.txtをlオプションで検索する場合
/etc/test.txt
1 aaa
2 bbb
3 ccc
4 ddd
5 eee
6 fff
/etc/test1.txt
1 aaa
2 aaa
3 bbb
4 aaa
5 bbb
6 ccc
grep -l ddd /etc/test.txt /etc/test1.txt
実行結果
test.txt #パターンと一致したものを含むファイル名のみが表示される
####使用例13
一致するものが含まれていないファイルのファイル名のみ表示する
#/etc/test.txtと/etc/test1.txtをLオプションで検索する場合
/etc/test.txt
1 aaa
2 bbb
3 ccc
4 ddd
5 eee
6 fff
/etc/test1.txt
1 aaa
2 aaa
3 bbb
4 aaa
5 bbb
6 ccc
grep -L ddd /etc/test.txt /etc/test1.txt
実行結果
test1.txt #パターンと一致したものを含まないファイル名のみが表示される
####使用例14
パターンと一致するものを含む行が指定した数に達したら処理を終了する
#/etc/test1.txtをmオプションで検索した場合
/etc/test1.txt
1 aaa
2 aaa
3 bbb
4 aaa
5 bbb
6 ccc
grep -m 2 aaa /etc/test1.txt
実行結果
1 aaa #回数を2と指定したので1行目と2行目のみが表示される
2 aaa
####使用例15
行番号を併せて表示する
#/etc/test.txtをnオプションで検索した場合
/etc/test.txt
aaa
bbb
ccc
ddd
eee
fff
grep -n ccc /etc/test.txt
実行結果
3 ccc #行番号も併せて表示される
####使用例16
一致した箇所だけを表示する
#/etc/test2.txtをoオプションで検索した場合
/etc/test2.txt
aaa bbb ccc
ddd eee fff
ggg hhh iii
grep -o aaa /etc/test2.txt
実行結果
aaa #パターンと一致した箇所のみ表示されるので、「bbb ccc」は表示されない
####使用例17
結果を表示しない(主にシェルスクリプトなどで判定用に使う)
#/etc/test.txtをqオプションで検索する場合
/etc/test.txt
aaa
bbb
ccc
ddd
eee
fff
grep -q aaa /etc/test.txt
実行結果なし #実行結果が表示されない
####使用例18
パターンに一致しない行を表示する
#/etc/test.txtをvオプションで表示する場合
/etc/test.txt
aaa
bbb
ccc
ddd
eee
fff
grep -v aaa /etc/test.txt
実行結果
bbb #パターンと一致しない行が表示される
ccc
ddd
eee
fff
####使用例19
ディレクトリを指定した場合はサブディレクトリ内のファイルも含めて検索する
#/etc/test(ディレクトリ)をrオプションで検索した場合
下記のようなディレクトリ構造という想定
etc-test-testtest(ディレクトリ)-test1.txt(ファイル)
-test.txt(ファイル)
/etc/test/test.txt
aaa
bbb
ccc
ddd
eee
fff
/etc/test/testtest/test1.txt
aaa
aaa
bbb
aaa
bbb
ccc
grep -r aaa /etc/test
実行結果
test.txt:aaa
testtest/test1.txt:aaa #サブディレクトリ(testtest)にあるファイルの中身まで検索される
testtest/test1.txt:aaa
testtest/test1.txt:aaa
####使用例20
サブディレクトリ、さらにシンボリックリンクの先まで含めて検索する
#/etc/testをRオプションで検索した場合
下記のようなディレクトリの構成を想定
etc-test-testtest(ディレクトリ)-test1.txt
-test.txt
-test.3txt(tteesstt.txtのシンボリックリンク)
-tteesstt.txt
/etc/test/test.txt
aaa
bbb
ccc
ddd
eee
fff
/etc/test/testtest/test1.txt
aaa
aaa
bbb
aaa
bbb
ccc
zzz
/etc/tteesstt.txt
xxx
yyy
zzz
grep -R zzz /etc/test
実行結果
test/testtest/test1.txt:zzz #サブディレクトリにあるファイルとシンボリックリンク先のファイルまで検索して表示する
test/test3.txt:zzz