このチュートリアルでは、grepコマンドと正規表現を使用してファイル内のテキストを検索することに焦点を当てています。
Linuxシステムで作業する場合、ファイル内のテキストを検索する これは、システム管理者が毎日行う非常に一般的なタスクです。
特定の行を検索することが必要な場合があります サーバーの問題をトラブルシューティングするためにログファイルに記録します。
場合によっては、特定のユーザーによって実行されたアクションを見つけることに関心がある場合や、大きなファイルの行を数行に制限したい場合があります。
幸いなことに、Linuxでテキストをファイルに検索する方法は複数あります。 ただし、最も一般的なコマンドはgrepコマンドです。
Unixの初期にKenThompsonによって開発されたgrep( g rを大げさに検索する egular e xpressionとp リント )世界中のシステム管理者によって45年以上使用されています。
このチュートリアルでは、grepコマンドに焦点を当てます。 そして、それがシステム全体のファイル内のテキストを効果的に見つけるのにどのように役立つか。
準備はいいですか?
LinuxでのGrep構文
上記のように、Linux上のファイル内のテキストを検索するために 、次の構文でgrepコマンドを使用する必要があります
$ grep <option> <expression> <path>
オプションとパスはオプションであることに注意してください。

grepが提供するすべてのオプションを一覧表示して詳しく説明する前に、grepコマンドの構文を簡単に覚えてみましょう。
grepコマンドの構文を覚えておくために、grepは grEPと書くことができることを覚えておいてください。 これは、式がパスの前に来ることを意味します。
これは、grep構文とfind構文を同時に覚えるのに最適な方法ですが、 find構文は正反対です:最初のパスとその後の式
簡単なgrepの例
grepで使用できる複雑なオプションがありますが、一連の非常に簡単な例から始めましょう。
grepを使用したユーザーの一覧表示
Linuxでは、おそらくすでにご存知のとおり、ユーザーアカウントはpasswdファイルと呼ばれる特定のファイルにリストされています。
特定のファイルでrootアカウントを見つけるには、テキストと検索するファイルを入力するだけです。
$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
grepコマンドを使用するもう1つの非常に一般的な方法は、Linuxシステムで特定のプロセスを探すことです。
grepを使用したプロセスのフィルタリング
以前のチュートリアルの1つで説明したように、「 ps」を使用する必要があります 」コマンドを使用して、システムで現在実行されているすべてのプロセスを一覧表示します。
「ps」をパイプできます 」コマンドと「grep 」コマンドを使用して、関心のあるプロセスをフィルタリングします。
$ ps aux | grep <process>
たとえば、bashプロセスに関心がある場合は、次のコマンドを入力できます
$ ps aux | grep bash
root 1230 0.0 0.0 23068 1640 tty1 S+ Jan11 0:00 -bash
user 2353 0.0 0.1 23340 5156 pts/0 Ss 03:32 0:00 -bash
user 2473 0.0 0.0 14856 1056 pts/0 S+ 03:45 0:00 grep --color=auto bash
user 6685 0.0 0.0 23140 1688 pts/2 Ss+ Nov09 0:00 bash
注 :Linuxでパイプを使用する方法がわからない場合は、ここに入力と出力のリダイレクトに関する完全なガイドがあります。
grepを使用したLinuxカーネルログの検査
grepコマンドのもう1つの優れた使用法は、Linuxカーネルバッファリングを検査することです。 。
これは、Linuxシステムでトラブルシューティング操作を実行するときに頻繁に使用されます。これは、カーネルが起動時または起動時にバッファリングに書き込むためです。
たとえば、システムに新しいディスクを導入したが、この新しいディスクに付けられた名前がわからないとします。
この情報を見つけるために、「 dmesg」を使用できます。 」コマンドを実行し、grepコマンドにパイプします。
$ dmesg | grep -E sd.{1}

Grepコマンドオプション
grepコマンドはそれ自体で非常に便利ですが、オプションとともに使用するとさらに便利です。
grepコマンドには、文字通りさまざまなオプションがあります。
次のセクションは、これらのオプションを適切に使用するためのガイドとして機能し、その過程で例を示します。
grepを使用して特定の文字列を検索
場合によっては、非常に具体的な文字列またはテキストをファイルに検索することに関心があるかもしれません。
テキスト検索を特定の文字列に制限するには、引用符を使用する必要があります 検索語の前後。
$ grep "This is a specific text" .
このオプションを説明するために、特定のユーザー名を探しているとしましょう。 システム上で。
多くのユーザー名は同じプレフィックスで始まる可能性があるため、引用符を使用してユーザーを検索する必要があります。
$ grep "devconnected" /etc/passwd

正規表現を使用してテキストを検索
grepコマンドの最大の機能の1つは、正規表現を使用してテキストを検索できることです。
正規表現は間違いなく習得するのに最適なツールです。ユーザーは、特定の文字で始まるテキストやメールアドレスとして定義できるテキストなどのパターンに基づいてテキストを検索できます。
Grepは2種類の正規表現をサポートしています:基本 および拡張 正規表現。
基本正規表現(BRE)
基本正規表現と拡張正規表現の主な違いは、BRE(基本正規表現)で正規表現記号を使用できることですが、前に円記号を付ける必要があります。
最も一般的な正規表現パターンの詳細を例とともに以下に示します:
- ^記号 :キャレット記号とも呼ばれるこの小さな帽子記号は、行の先頭を定義するために使用されます。結果として、キャレット記号の後のテキストは、このテキストで始まる行と一致します。
たとえば、「sd」で始まるすべてのドライブ(SCSIディスクとも呼ばれます)を検索するには、grepでキャレット記号を使用できます。
$ lsblk | grep "^sb"

- $ 記号 :ドル記号はキャレット記号の反対であり、行の終わりを定義するために使用されます。結果として、パターンマッチングはドル記号の直前で停止します。これは、特定の用語をターゲットにする場合に特に便利です。
システムにbashシェルを使用しているすべてのユーザーを表示するには、次のコマンドを入力します
$ cat /etc/passwd | grep "bash$"

- 。 (ドット記号):ドット記号は、正規表現の1文字に一致するために使用されます。これは、検索語の最初と最後に同じ文字が含まれているが、途中には含まれていない場合に特に便利です。
たとえば、システムに2人のユーザーがいて、1人は「bob」、もう1人は「bab」という名前の場合、ドット記号を使用して両方のユーザーを見つけることができます。
$ cat /etc/passwd | grep "b.b"

- [](角かっこ記号):この記号は、文字のサブセットのみに一致するために使用されます。 「a」、「o」、または「e」の文字のみを照合する場合は、角かっこで囲みます。
「bob」の例に戻り、検索を「bob」と「bab」に限定する場合は、次のコマンドを入力できます
$ cat /etc/passwd | grep "b[ao]b"

以前に提供されたすべてのオプションを使用すると、ファイル内の単一の単語を分離することができます。キャレット記号とドル記号を組み合わせることによって。
$ grep "^word$" <file|path>

幸いなことに、1つの単語のエントリを検索するたびに、これらの文字を入力する必要はありません。
「-w」を使用できます 代わりに」オプション。
$ grep -w <expression> <file|path>

拡張正規表現(ERE)
名前が示す拡張正規表現は、文字列を照合するためにより複雑な式を使用している正規表現です。
たとえば、拡張正規表現を使用して、電子メールアドレスに一致する式を作成できます。
拡張正規表現を使用してファイル内のテキストを検索するには、「-E」オプションを使用する必要があります。
$ grep -E <expression> <path>
拡張正規表現の優れた使用法の1つは、たとえば複数の検索用語を検索する機能です。
ファイル内の複数の文字列を検索する
ファイル内の複数の文字列を検索するには、「 -E」を使用します 」オプションを選択し、さまざまな検索用語を直線で区切ります(正規表現のOR演算子の略) )
$ grep -E "text1|text2|text3" <path>
前のgrepの例に戻ると、拡張正規表現を使用してrootアカウントとbobアカウントを見つけることができます。
$ grep -E "root|bob" /etc/passwd

grepを使用してIPアドレスを検索する
場合によっては、IPアドレスを1つのファイルに分離したいことがあります。拡張正規表現を使用すると、IPアドレスを簡単に見つけることができます。
さまざまなWebサイトで、すぐに使用できる正規表現が提供されています。これをIPアドレスに使用します。
"\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
この正規表現をどのように読みますか?
IPアドレスは、ドットで区切られた4つの3桁の数字で構成されます。これは、まさにこの正規表現が表すものです。
([0-9]{1,3}\.){3} = 3 3-digits numbers separated by dots
[0-9]{1,3} = the last 3-digits number ending the IP address
grepコマンドを使用してIPアドレスを検索する方法は次のとおりです
grep -E "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" <file|path>

grepを使用してURLアドレスを検索する
同様に、日常的にWebサイトの管理を行っている場合は、ファイル内のURLアドレスを検索することは完全に可能です。
繰り返しになりますが、多くのWebサイトではURLの正規表現が提供されていますが、これを使用します。
grep -E '(http|https)://[^/"]+' <file|path>

grepを使用してメールアドレスを検索する
最後に、拡張正規表現を使用してメールアドレスを検索することができます。
メールアドレスを見つけるには、次の正規表現を使用します
grep -E "\b[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" <file|path>

grepで拡張正規表現を使用する方法を確認したので、オプションを使用してファイル内のテキストを再帰的に検索する方法を見てみましょう。
grepを使用して再帰的にテキストを検索
Linuxでテキストを再帰的に検索する(つまり、すべてのディレクトリとその子を探索する)には、「-r」オプションを指定した「grep」を使用する必要があります(再帰的)
$ grep -R <expression> <path>
たとえば、/ var / logディレクトリで「log」という単語を含むすべてのファイルを検索するには、「
」と入力します。$ grep -R "log$" /var/log
このコマンドを使用すると、許可が拒否されたエントリが多数表示される可能性が非常に高くなります。
これらのアクセス許可が拒否されたエントリを無視するには、コマンドの出力を/ dev / null
にリダイレクトします。$ grep -R "log$" /var/log 2> /dev/null

テキストを再帰的に検索するために、「再帰」アクションで「-d」オプションを使用することもできます。
$ grep -d recurse "log$" /var/log
システム上の特定の構成ファイルを検索する場合は、テキストを再帰的に検索すると非常に便利です。
grepを使用した行番号の印刷
前の例でわかるように、指定されたパターンに一致する線を分離することができました。
さらに、ファイルに数千行が含まれている場合、ファイルを識別するのは面倒ですが、行番号は識別できません。
幸いなことに、grepオプションには、さまざまな一致とともに行番号を印刷するためのオプションがあります。
grepを使用して行番号を表示するには、「 -n」を使用するだけです。 」オプション。
$ grep -n <expression> <path>
ユーザーリストの例に戻って、これらのエントリがどの行にあるかを知りたい場合は、「
」と入力します。$ grep -n -E "root|bob" /etc/passwd

大文字と小文字を区別しないオプションを使用してgrepでテキストを検索
場合によっては、テキストが大文字で書かれているかどうかわからないことがあります。 または小文字 手紙。
幸いなことに、grepコマンドには、大文字と小文字を区別しないオプションを使用してファイル内のテキストを検索するためのオプションがあります。
大文字と小文字を区別しないオプションを使用してテキストを検索するには、「 -i」を使用します。 」オプション。
$ grep -i <expression> <path>

grepからパターンを除外する
Grepは、特定のファイルを含むファイルを識別する方法として使用されますが、正反対のことをしたい場合はどうでしょうか?
Linuxシステムで特定の文字列を含まないファイルを検索したい場合はどうしますか?
これが、grepの逆検索オプションの全体的な目的です。
特定の文字列を含むファイルを除外するには、「-v」オプションとともに「grep」を使用します。
$ grep -v <expression> <file|path>
少し例として、3つのファイルがあり、そのうちの2つに「ログ」という単語が含まれているとします。
これらのファイルを除外するには、「-v」オプションを使用して逆一致を実行する必要があります。

grepを使用してファイル名を表示する
場合によっては、ファイル内のテキストを検索するのではなく、ファイル名のみを検索することに関心があります。
実際の出力を含むファイル名ではなく、ファイル名のみを印刷するには、「-l」オプションを使用します。
$ grep -l <expression> <path>
前の例を使用すると、ファイルのコンテンツは取得されず、ファイル名のみが取得されます。

結論
このチュートリアルでは、Linuxでファイル内のテキストを簡単に見つける方法を学びました。
基本的な正規表現またはより高度ななど、さまざまなオプションを使用できることを学びました。 (拡張)たとえば、IPアドレスや電話番号を照合する場合の正規表現。
また、逆ルックアップを実行できることも発見しました。 ではないファイルを見つけるため システム上の特定のパターンに一致します。
Linuxシステム管理に興味がある場合は、Webサイトに専用のセクションがありますので、ぜひご覧ください。