Linux

【Linuxコマンド】grepの使い方基本編

開発をしていると、この関数はどこのソースファイルに記述されているの?この文字列を含む設定ファイルはどこにあるの?なんてことは、良くあることです。

この悩みをサクッと解決してくれるのがgrepコマンドです。

今回は、grepコマンドの基本的な使い方を紹介します。

ディレクトリ配下のファイルをgrepする方法

grepコマンドはこんなときに使う

例えば、複数のあるディレクトリにソースファイルが存在するとします。
複数のソースファイルの中から、「ある特定の文字列」が記述されているファイルを特定したいときに使用します。

grepコマンドの構成

コマンド構成は以下になります。ディレクトリは複数指定可能になります。

-r」のオプションを使うとディレクトリ配下を再帰的に検索するようになります。

$ grep [–r] 検索したい文字列 ディレクトリ名1 ディレクトリ名2 …
再帰的とは、「ディレクトリ配下全てのファイルを対象とし、そのひとつがディレクトリの場合は、そのディレクトリ配下全てのファイルを対象とする」というイメージです。
ディレクトリ配下の全ファイル対象ということになります。

実際にディレクトリをgrepする

“password”の文字列でディレクトリ配下を再帰的にgrepします。

$ grep –r password work1
work1/:main.c:password

work1ディレクトリのmain.cがgrepでヒットしました。

次に、「-i」のオプションを付けて大文字小文字を区別しない検索文字列を条件に、grepします。

$ grep –r –i password work1
work1/sample.c:passWORD
work1/main.c:password
work1/func.c:PASSWORD

work1ディレクトリのsample.c、main.c、func.cがヒットしました。

次に、work2のディレクトリも指定してgrepします。

$ grep –r –i password work1 work2
work1/sample.c:passWORD
work1/main.c:password
work1/func.c:PASSWORD
work2/test.c:PassWord

work1ディレクトリのsample.c、main.c、func.c、さらにwork2ディレクトリのtest.cがヒットしました。
このようにディレクトリ配下のファイルに対して、ある特定の文字列で検索したい場合にgrepを使用します。

複数の文字列を指定してgrepする方法

grepコマンドの構成(OR条件)

例えば、"東京"または"大阪"の文字列を含む行をヒットさせるときは、「-e」オプションを使って複数の文字列を指定します。

-e」オプションで文字列を複数指定し、grepするときのコマンド構成になります。

$ grep [-e] 文字列1 [-e] 文字列2… ディレクトリ

では、実際にgrepしてみましょう。

はじめに「vi」コマンドでtest.txtの内容を確認します。

$ vi ./work/test.txt
tokyo
osaka
kyoto
okinawa
Tokyo
Osaka
Kyoto
Okinawa

“tokyo”と”osaka”を指定してgrepしてみます。

$ grep -r -e tokyo -e osaka ./work/
./work/test.txt:tokyo
./work/test.txt:osaka

“tokyo”と”osaka”がヒットしました。

大文字小文字を区別しない「-i」オプションを使ってgrepしてみます。

$ grep –i -r -e tokyo -e osaka ./work/
./work/test.txt:tokyo
./work/test.txt:osaka
./work/test.txt:Tokyo
./work/test.txt:Osaka

“tokyo”と”osaka”、さらに”Tokyo“と”Osaka”がヒットしました。

次に、あるコマンドの実行結果をパイプ(「|」)で引き渡し、grepする方法を紹介します。

$ コマンド | grep [-e] 文字列1 [-e] 文字列2…

次の条件でgrepをしてみます。

  1. dmesg」コマンドでカーネルのメッセージを取得
  2. 1の結果に対して"input"の文字列、または"button"の文字列でgrepする
grepでは、大文字小文字を区別しない「-i」オプションを指定します。

$ dmesg | grep -i -e input -e button
[    6.040477] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
[    6.040482] ACPI: Power Button [PWRF]
[    6.040579] input: Sleep Button as /devices/LNXSYSTM:00/LNXSLPBN:00/input/input1
[    6.040583] ACPI: Sleep Button [SLPF]
[    6.123876] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input2
[    6.841861] input: VirtualBox USB Tablet as /devices/pci0000:00/0000:00:06.0/usb1/1-1/1-1:1.0/input/input4
[    6.842940] hid-generic 0003:80EE:0021.0001: input,hidraw0: USB HID v1.10 Mouse [VirtualBox USB Tablet] on usb-0000:00:06.0-1/input0
[   14.729532] input: Video Bus as /devices/LNXSYSTM:00/device:00/PNP0A03:00/LNXVIDEO:00/input/input5
[   14.774733] input: Unspecified device as /devices/pci0000:00/0000:00:04.0/input/input6
[   14.996341] input: ImExPS/2 Generic Explorer Mouse as /devices/platform/i8042/serio1/input/input7

grepコマンドの構成(AND条件)

例えば、”東京”の文字列を含む行に対して、”大阪”を含む行のみをヒットしたいときは、パイプ(「|」)を使います。

$ コマンド | grep 文字列1 | grep 文字列2

今回は以下の内容を目的として検索してみます。

  1. dmesg」コマンドでカーネル起動メッセージを取得
  2. 1の結果に対して"input"の文字列でgrepする
  3. 2の結果に対して"button"の文字列でgrepする
grepでは、大文字小文字を区別しない「-i」オプションを指定します。

$ dmesg | grep -i input | grep -i button
[    6.040477] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
[    6.040579] input: Sleep Button as /devices/LNXSYSTM:00/LNXSLPBN:00/input/input1

OR条件、AND条件で文字列を指定してgrepする方法を紹介でした。

サイトマップはこちら↓

▼ Linuxコマンドの記事一覧に戻る

-Linux

Copyright© カズンのブログ , 2020 All Rights Reserved Powered by AFFINGER5.