Linux - grepの仕組みと基本的な使い方

# grepの使い方

## 概要

`grep`（Global search REgular expression and Print out the line）は、ユーザーが指定した「パターン」に基づいて目的のテキストを行ごとにマッチングチェックし、マッチした行を表示するテキスト検索ツールです。このパターンは、正規表現の文字とテキスト文字で記述されたフィルタ条件です。

詳しい使い方は以下のマニュアルを参照してください:
[man7.org/linux/man-pages/man1/grep.1.html](https://man7.org/linux/man-pages/man1/grep.1.html)

## 使用方法

```shell
grep [OPTIONS] PATTERN [FILE...]
```

### よく使われるオプション:

- `-E|--extended-regexp`         # EREを使用する、`egrep`と同じ
- `-F|--fixed-strings`           # 正規表現をサポートしない、`fgrep`と同じ
- `-G|--basic-regexp`            # スタイルを基本の正規表現として扱う
- `-P|--perl-regexp`             # Perl形式の正規表現をサポート
- `-e|--regexp=PATTERN`          # 複数のオプション間の論理的OR関係を実現, 例: `grep -e 'cat' -e 'dog' file`
- `-f|--file=FILE`               # ファイルからマッチングルールを読み込む、各行に一つ
- `-i|--ignore-case`             # 大文字と小文字の区別をしない
- `-w|--word-regexp`             # 単語全体にマッチする
- `-x|--line-regexp`             # 行全体にマッチする
- `-s|--no-messages`             # エラーメッセージを表示しない
- `-v|--invert-match`            # マッチしなかった行を表示する、逆マッチ
- `-B|--before-context=N`        # マッチした文字列がある行とその前N行を表示
- `-A|--after-context=N`         # マッチした文字列がある行とその後N行を表示
- `-C|--context=N|--context=N`   # マッチした文字列がある行とその前後N行を表示
- `--color=auto`                 # マッチした内容をハイライト表示[always|never|auto]
- `-m|--max-count=N`             # 最初のN行のみマッチする
- `-b|--byte-offset`             # マッチした行の最初の文字の位置を表示
- `-n|--line-number`             # マッチした行の行番号を表示
- `-H|--with-filename`           # マッチした行が存在するファイル名を表示
- `-h|--no-filename`             # マッチした行が存在するファイル名を表示しない
- `-o|--only-matching`           # マッチした文字列のみを表示
- `-q|--quiet|--silent`          # 静かなモード、結果は変数$0から取得
- `--binary-files=TYPE`          # バイナリファイルの取り扱い方法指定 [binary|text|without-match]
- `-a|--text`                    # `--binary-files=text`と同じ
- `-I`                           # `--binary-files=without-match`と同じ
- `-d|--directories=ACTION`      # ディレクトリの探索方法 [read|recurse|skip]
- `-D|--devices=ACTION`          # デバイスファイルの取り扱い方法 [read|skip]
- `-r|--recursive`               # ディレクトリ内を再帰的に検索、シンボリックリンクは処理しない
- `-R|--dereference-recursive`   # ディレクトリ内を再帰的に検索、シンボリックリンクを処理
- `-L|--files-without-match`     # マッチしなかったファイルの名前のみ表示
- `-l|--files-with-matches`      # マッチしたファイルの名前のみ表示
- `-c|--count`                   # マッチした行の数を集計

### 例:

#### 標準入力からの検索

```shell
[root@rocky86 ~]# grep hello
123hello456
123hello456
[root@rocky86 ~]# grep hello -
123hello456 
123hello456
```

標準入力から`hello`という文字列を含む行を検索します。

#### ファイル処理

```shell
[root@rocky86 ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
```

`/etc/passwd`ファイル内で`root`という文字列を含む行を検索します。

#### パイプを通じた検索

```shell
[root@rocky86 ~]# cat /etc/passwd | grep root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
```

`cat`コマンドで表示した`/etc/passwd`の内容から`root`という文字列を含む行を検索します。

#### 入力リダイレクションを使用した検索

```shell
[root@rocky86 ~]# grep root < /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
```

`/etc/passwd`ファイルから`root`を検索します。入力はファイルリダイレクションを通じて提供されます。

#### マッチする最初の3行を表示

```shell
[root@rocky86 ~]# grep -m 3 bin /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
```

`/etc/passwd`ファイルから`bin`を含む最初の3行を検索します。

#### 反転して、一致しない行を取得する

```shell
[root@rocky86 ~]# grep -v nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
jose:x:1010:1010::/home/jose:/bin/bash
jerry:x:1011:1011::/home/jerry:/bin/bash
mage:x:1000:1000::/home/mage:/bin/bash

#コメント行を無視
[root@rocky86 ~]# grep -v "#" /etc/fstab 
```
#### 大文字と小文字を区別しない
```shell
[root@rocky86 ~]# grep -i ROOt /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

```

#### 行番号を表示
```shell
[root@rocky86 ~]# grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
```

#### 行に一致する数を表示
```shell
[root@rocky86 ~]# grep -c root /etc/passwd
2
```

#### 一致した内容のみを表示
```shell
[root@rocky86 ~]# grep -o root /etc/passwd
root
root
root
root
```

#### サイレントモード
```shell
[root@rocky86 ~]# grep -q root /etc/passwd
[root@rocky86 ~]# echo $?
0
[root@rocky86 ~]# grep -q roottttttt /etc/passwd
[root@rocky86 ~]# echo $?
1
```

#### 表示一致した行とその後の2行
```shell
[root@rocky86 ~]# grep -A 2 root /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
```

#### 表示一致した行とその前の2行
```shell
[root@rocky86 ~]# grep -B 2 root /etc/passwd
root:x:0:0:root:/root:/bin/bash
--
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
```

#### 表示一致した行とその前後の各2行
```shell
[root@rocky86 ~]# grep -C 2 root /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
```

#### 表示「root」と一致する行または「bash」と一致する行
```shell
[root@rocky86 ~]# grep -e root -e bash /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
jose:x:1010:1010::/home/jose:/bin/bash
jerry:x:1011:1011::/home/jerry:/bin/bash
mage:x:1000:1000::/home/mage:/bin/bash
```

#### 表示「root」とも「bash」とも一致する行
```shell
[root@rocky86 ~]# grep root /etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
```

#### ファイルから一致する規則を読み取る
```shell
[root@rocky86 ~]# cat test.txt 
root
bash
[root@rocky86 ~]# grep -f test.txt /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
jose:x:1010:1010::/home/jose:/bin/bash
jerry:x:1011:1011::/home/jerry:/bin/bash
mage:x:1000:1000::/home/mage:/bin/bash
```

#### 再帰的なマッチング
```shell
#リンクを処理しない
[root@rocky86 ~]# grep -r root /etc/*
#リンクを処理する
[root@rocky86 ~]# grep -R root /etc/*
```

#### 特定の条件に一致するファイル名のみを表示し、詳細な内容は表示しない
```shell
[root@rocky86 ~]# grep root -l /etc/passwd /etc/sudoers /etc/my.cnf /etc/issue
/etc/passwd
/etc/sudoers
```

#### 特定の内容がどのファイルから来たかを表示する
```shell
[root@rocky86 ~]# grep -H root /etc/passwd /etc/sudoers /etc/my.cnf /etc/issue
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
/etc/sudoers:## the root user, without needing the root password.
/etc/sudoers:## Allow root to run any commands anywhere 
/etc/sudoers:root ALL=(ALL) ALL
/etc/sudoers:## cdrom as root
```

#### コマンドライン展開
```shell
[root@rocky86 ~]# grep `whoami` /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@rocky86 ~]# grep $(whoami) /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@rocky86 ~]# echo Linux123 | grep $(uname) 
Linux123
```
#### 変数展開
```shell
[root@rocky86 ~]# grep "$USER" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
```
#### CPUコア数を取得
```shell
[root@rocky86 ~]# grep -c processor /proc/cpuinfo
2
```

#### パーティションの利用率の最大値
```shell
[root@centos8 ~]#df | grep '^/dev/sd' |tr -s ' ' %|cut -d% -f5|sort -n|tail -1
[root@centos8 ~]#df |grep '^/dev/sd' |grep -oE '\<[0-9]{,3}%'|tr -d '%'|sort -nr|head -n1
[root@centos8 ~]#df |grep '^/dev/sd' |grep -oE '\<[0-9]{,3}%'|grep -Eo '[0-9]+' |sort -nr|head -n1
13
```

#### 現在のホストに最も多く接続している上位3つのIPアドレスを取得する
```shell
[root@centos8 ~]#ss -nt | grep "^ESTAB" |tr -s ' ' : |cut -d: -f6|sort |uniq -c|sort -nr|head -n3
      3 10.0.0.1
      1 172.16.4.100
      1 172.16.31.188
```

#### 接続状態の統計
```shell
[root@wang-liyun-pc ~]# ss -nta | grep -v '^State' |cut -d" " -f1|sort |uniq -c
      7 ESTAB
      4 LISTEN
      7 TIME-WAIT     
[root@wang-liyun-pc ~]# ss -nta | tail -n +2 |cut -d" " -f1|sort |uniq -c
      3 ESTAB
      4 LISTEN
     12 TIME-WAIT
```

#### ファイルのコメント (# 記号の付いた行を含む) と空白行をフィルターで除外
```shell
[root@centos8 ~]#grep -Ev '^$|#' /etc/fstab 
UUID=01f1068e-6937-4fb2-b64b-0d7d6b85ad08 /           xfs     defaults        0
0
UUID=cb21e5ce-edf6-4ed1-8df9-ba98520a68dc /boot       xfs     defaults        0
0
UUID=9ea3524a-7cff-49a0-951e-8429a30bd0a0 /data       xfs     defaults        0
0
UUID=42174d44-41aa-448b-88bc-fd36d6a49e39 swap         swap   defaults        0
0
```

### 注意:

上記の例は、`grep`コマンドの基本的な使用方法を示しています。オプションや引数を変更することで、様々な検索条件や出力フォーマットを指定することができます。