grepで該当した行の前後を表示する方法

2021-06-22

概要

grepでログファイルなどを調べた場合、該当した(パターンマッチした)行だけはなく該当した行の前後や、該当した行の前5行とか、該当した行の前5行とか表示したい場合があります。

その場合は、grepコマンドのオプションの「-A」・「-B」・「-C」を使います。

  • 該当した行の後を表示する場合は、「-A」
  • 該当した行の前を表示する場合は、「-B」
  • 該当した行の前後を表示する場合は、「-C」

コマンド

実際に、grepコマンドの「-A」・「-B」・「-C」オプションを使用した例で説明します。説明で使用するファイルは、以下のような /etc/groupを加工したファイルを利用します

$ cat test.log
1:root:x:0:
2:bin:x:1:
3:daemon:x:2:
4:sys:x:3:
5:adm:x:4:
6:tty:x:5:
7:disk:x:6:
8:lp:x:7:
9:mem:x:8:
10:kmem:x:9:
11:wheel:x:10:
12:cdrom:x:11:
13:mail:x:12:
14:man:x:15:
15:dialout:x:18:
16:floppy:x:19:
17:games:x:20:
18:tape:x:30:
19:video:x:39:
20:ftp:x:50:
21:lock:x:54:
22:audio:x:63:
23:nobody:x:99:
24:users:x:100:
25:utmp:x:22:

 

grep -A (該当した行の後◯行を表示)

検索するファイル内に検索する文字列が該当した場合、該当した行と後の◯行を出力します
grep -A 【行数】検索文字列 【検索するファイル名】

キーワードが「sys」で該当した行の後2行を表示する(-A 2)と、該当した行の後5行を表示する(-A 5)を使用した場合のサンプルです

$ grep -A 2 sys test.log
4:sys:x:3:
5:adm:x:4:
6:tty:x:5:

$ grep -A 5 sys test.log
4:sys:x:3:
5:adm:x:4:
6:tty:x:5:
7:disk:x:6:
8:lp:x:7:
9:mem:x:8:

grep -B (該当した行の前◯行を表示)

検索するファイル内に検索する文字列が該当した場合、該当した行と前の◯行を出力します
grep -B 【行数】検索文字列 【検索するファイル名】

キーワードが「ftp」で該当した行の前2行を表示する(-A 2)と、該当した行の前5行を表示する(-A 5)を使用した場合のサンプルです

$ grep -B 2 ftp test.log
18:tape:x:30:
19:video:x:39:
20:ftp:x:50:

$ grep -B 5 ftp test.log
15:dialout:x:18:
16:floppy:x:19:
17:games:x:20:
18:tape:x:30:
19:video:x:39:
20:ftp:x:50:

grep -C (該当した行の前後◯行を表示)

検索するファイル内に検索する文字列が該当した場合、該当した行と前後の◯行を出力します
grep -C 【行数】検索文字列 【検索するファイル名】

該当した行キーワードが「mail」で該当した行の前後2行を表示する(-A 2)と、該当した行の前後5行を表示する(-A 5)を使用した場合のサンプルです

$ grep -C 2 mail test.log
11:wheel:x:10:
12:cdrom:x:11:
13:mail:x:12:
14:man:x:15:
15:dialout:x:18:

$ grep -C 5 mail test.log
8:lp:x:7:
9:mem:x:8:
10:kmem:x:9:
11:wheel:x:10:
12:cdrom:x:11:
13:mail:x:12:
14:man:x:15:
15:dialout:x:18:
16:floppy:x:19:
17:games:x:20:
18:tape:x:30:

grep -A -B (該当した行の前◯行、後◯行を表示)

-Aと-Bを組み合わせ使用した場合は、検索するファイル内に検索する文字列が該当した場合、該当した行と前の◯行、後の◯行を出力できます
grep -A 【行数】-B 【行数】検索文字列 【検索するファイル名】

該当した行キーワードが「game」で該当した行の後2行(-A 2)と前の5行(-B 5)を表示する場合のサンプルです

$ grep -A 2 -B  5 game test.log
12:cdrom:x:11:
13:mail:x:12:
14:man:x:15:
15:dialout:x:18:
16:floppy:x:19:
17:games:x:20:
18:tape:x:30:
19:video:x:39: