Linux　grepコマンドの使い方

### __grepコマンドとは__ 
ファイルの中の特定の文字列（パターン）がある行を抽出するコマンド
Linuxコマンドの中で最もよく使うコマンドの1つ

### __基本書式__

```
grep [オプション］　検索パターン　ファイル名 [ファイル名]　#ファイル名は複数指定できる

もしくは

コマンド | grep [オプション］ 検索パターン
※[]は省略可
```

### __オプション__

●検索関連のオプション　

|オプション|意味|サンプルコード|
|:-:|:--|:-:|
|-E|検索に拡張正規表現を使う|[使用例１](#使用例１)
|-i|大文字と小文字を区別せずに検索する|[使用例2](#使用例2)
|-P|検索にPerl正規表現を使う|[使用例３](#使用例３)
|-x|行全体がパターンと一致するものを検索する|[使用例4](#使用例4)

●表示関連のオプション

|オプション|意味|サンプルコード|
|:-:|:--|:-:|
|-A 行数|一致した行の後の行も表示する|[使用例5](#使用例5)
|-b|パターンの前に何文字あるかを併せて表示する|[使用例6](#使用例6)
|-B 行数|一致した行の前の行も表示する|[使用例7](#使用例7)
|-c|一致するものが含まれている回数のみ表示|[使用例8](#使用例8)
|-C 行数|一致した行の前後の行も表示する|[使用例9](#使用例9)
|-h|ファイル名を表示しない（複数ファイル指定時）|[使用例10](#使用例10)
|-H|ファイル名を併せて表示する|[使用例11](#使用例11)
|-l|一致するものが含まれているファイルのファイル名のみ表示する|[使用例12](#使用例12)
|-L|一致するものが含まれていないファイルのファイル名のみ表示する|[使用例13](#使用例13)
|-m 回数|パターンと一致するものを含む行が指定した数に達したら処理を終了する|[使用例14](#使用例14)
|-n|行番号を併せて表示する|[使用例15](#使用例15)
|-o|一致した箇所だけを表示する|[使用例16](#使用例16)
|-q|結果を表示しない（主にシェルスクリプトなどで判定用に使う）|[使用例17](#使用例17)
|-v|パターンに一致しない行を表示する|[使用例18](#使用例18)

●検索対象関連のオプション

|オプション|意味|サンプルコード|
|:-:|:--|:-:|
|-r|ディレクトリを指定した場合はサブディレクトリ内のファイルも含めて検索する|[使用例19](#使用例19)
|-R|サブディレクトリも含めて検索、さらにシンボリックリンクの先|[使用例20](#使用例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」から始まる４文字の単語が含まれる行が表示される
  hoge:x:1000:1000::/home/hoge:/bin/bash     #正規表現の詳細については別ページ参照
  
```

####使用例１
__検索に拡張正規表現を使う__

```
#/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」を含む行があれば、その行も表示される

```

####使用例３
__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     #パターンと一致した３行目と1つ後の４行目が表示される
  4 ddd

grep -A2 ccc /etc/text.txt
  実行結果
  3 ccc     #パターンと一致した３行目と後ろの４行目と５行目が表示される
  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
  実行結果
　２０：fff     #パターンと一致した文字列の前に何文字あるかを一緒に表示される（改行や空白も１文字に含まれる）

```

####使用例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 fff

grep -B2 fff /etc/test.txt
  実行結果
  ４ ddd     #パターンと一致した６行目とその前の４行目と５行目が表示される
  5 eee     #「-B」の後の数字で何行前まで表示するか決められる
  6 fff
 
```

####使用例8
__パターンと一致したものが含まれる行の行数のみを表示する__

```

#/etc/test1.txtをcオプションで検索する場合

/etc/test１.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 -C１ eee /etc/test.txt 
  実行結果
  4 ddd     #パターンと一致した５行目とその前後の４行目と６行目が表示される
  5 eee
  6 fff

grep -C2 ddd /etc/test.txtで検索
  実行結果
  2 bbb     #パターンと一致した４行目とその前後の２行目、３行目、５行目、６行目が表示される
  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
  実行結果
  test１.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 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/test２.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(ディレクトリ）-test１.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   
                                                                                                                                                                                
```