フィードを購読する
Linux 

ファイルやテキストストリーム内のテキストのパターンを検索することは、システム管理者の仕事の中でも、特に一般的なタスクの 1 つです。さまざまなシステム設定の確認、データの分析、ログのトラブルシューティングをはじめとする、さまざまな作業を可能にする重要なスキルです。

Linux システムでテキスト検索に最も広く使用される方法は、コマンドライン・ユーティリティである grep を使用するやり方です。このユーティリティは元々、1970 年代初頭に UNIX オペレーティングシステム向けに開発されたものです。grep は時を経て進化し、現在 Linux で最も一般的に利用されているバージョンである GNU grep は、色付き出力などの追加機能を備えています。しかし、その主たる機能は今も変わりません。

grep を使用すると、単一ファイル、ファイルグループ、または stdin のテキストの中から、正規表現に一致するテキストをシェルパイプ演算子を使ってすばやく見つけられます。

この記事では、grep コマンドを使ったテキストの検索方法を説明します。

ファイル内のテキストを検索する

grep の最も基本的な使い方が、単一ファイル内のテキスト検索です。この場合、grep と入力し、それに続けて検索するテキストパターンと検索するファイル名を入力します。たとえば、Secure Shell (SSH) デーモンがどのポートを使用しているかを確認するには、/etc/ssh/sshd_config ファイル内で Port を検索します。

$ grep Port /etc/ssh/sshd_config 
Port 22 
#GatewayPorts no

ご覧のように grep は、テキストパターンの位置にかかわらず、そのパターンに一致するすべての行を見つけます。

[Linux grep コマンドチートシートをダウンロード ]

正規表現を使って grep を拡張する

先ほどの例では、SSH 設定ファイルで Port を検索すると、grep は 2 つの行を返しました。探していた行である Port 22 と、同じ検索パターンを含むもう 1 つの行です。場合によってはこのように、すべてを検索したいケースもあるでしょう。一方で、grep では関係のないエントリーが多く見つかるため、それをかき分けて必要な情報を見つけなければならない場合もあります。

それを避けるため、正規表現を使って、検索対象をより具体的に指定できます。たとえば、Port という単語で始まる行のみを検索するには、次のように正規表現の演算子 ^ を使います。

$ grep ^Port /etc/ssh/sshd_config 
Port 22

この場合、grep からは Port で始まる行のみが返されます。2 番目の行では Port は行の途中にあるからです。

また、コマンドライン・パラメーター -E を使った拡張正規表現を使用することもできます。たとえば、Port の後に数字が続くパターンを検索するには、次の正規表現を使用します。

$ grep -E "Port [1-9]+" /etc/ssh/sshd_config 
Port 22

また、$ 演算子を使って、あるテキストパターンで終わる行を検索することもできます。たとえば、sshd_config ファイル内にある none で終わる行をすべて見つけるには、次のように grep を使用します。

$ grep none$ /etc/ssh/sshd_config 
#RekeyLimit default none 
#AuthorizedPrincipalsFile none 
#AuthorizedKeysCommand none 
#ChrootDirectory none 
#VersionAddendum none 
#Banner none

正規表現は、grep の重要な要素であり、効果的で柔軟な検索を可能にしてくれます。ただし、正規表現はきわめて大きなテーマです。さらに詳しい情報は、Wikipedia の「正規表現」のページまたは「Regular expressions 101」をご覧ください。

複数のファイルやディレクトリからテキストを検索する

単一ファイル内のテキストパターンを見つけるのと同様に、grep を使って、複数のファイルやディレクトリ内のテキストを検索できます。複数のファイルから同時にテキストを検索するには、最初のファイル名の後に検索対象のファイルを指定するか、すべてのファイルを対象とする場合は、シェルワイルドカード (* など) を使用します。たとえば、2 つのファイルで設定を検索するには、次のようにします。

$ grep Port /etc/ssh/sshd_config /etc/ssh/ssh_config 
/etc/ssh/sshd_config:Port 22 
/etc/ssh/sshd_config:#GatewayPorts no 
/etc/ssh/ssh_config:# Port 22

複数のファイルを検索すると、grep からは一致が見つかったファイル名の後に一致した行が表示されます。

[ よく使うコマンドをすぐに確認できる Linux コマンドチートシート ]

複数のサブディレクトリで再帰的に検索を実行するには、コマンドラインフラグ -R を使います。

$ grep -R ^Port /etc 
/etc/ssh/sshd_config:Port 22

grep コマンドは高速で、すぐに結果が返されますが、検索対象として指定するファイルやサブディレクトリの数が多すぎると、時間がかかる場合があります。

別のコマンドの出力に含まれるテキストを検索する

他の UNIX ユーティリティと同様に grep も、別のコマンドの出力を grep にパイプで渡すことで stdin に対して機能します。この方法によって、すばやく簡単にコマンドの出力結果をフィルタリングして、探しているテキストパターンとの一致を見つけられます。

たとえば、Fedora または Red Hat Enterprise Linux (RHEL) オペレーティングシステムに openssh パッケージがインストールされているかどうかを確認したい場合、インストール済みのパッケージをすべてリストアップするコマンド rpm -qa の出力を grep にパイプで渡し、パターンを検索できます。

$ rpm -qa | grep ssh 
libssh-config-0.9.6-4.fc36.noarch 
libssh-0.9.6-4.fc36.x86_64 
openssh-8.8p1-1.fc36.1.x86_64

コマンドの長い出力結果も、grep でフィルタリングできるため、必要な情報を探しやすくなります。

[ Linux にアプリケーションをインストールするためのガイドを入手する ]

その他の役立つオプション

grep コマンドには、パターンを検索する方法や結果の表示方法を変更するためのさまざまなオプションが用意されています。この記事では、その一部を取り上げました。すべてのオプションをここで紹介することはできませんが、他にも便利なオプションがあります。

  • -i オプションは、大文字と小文字を区別しない検索を行う際に使用します。
  • -v オプションは、検索内容を反転し、パターンに一致しない行を表示します。
  • -w オプションは、他の単語の途中にあるパターンではなく、単語全体のみを検索できます。
  • --color オプションは、一致するパターンを色付きで出力し、見つけやすくします。

grep の全オプションのリストについては、man ページを参照してください。

次のステップ

GNU grep ユーティリティは柔軟で便利なツールであり、日々のシステム管理業務におけるさまざまなタスクの遂行に役立ちます。grep は使うほどに使い勝手の良さがわかり、気付けばいつも活用するツールになっていること間違いありません。

grep について詳しくは、以下のリンクを参照してください。

Linux システムにおける grep の詳細については、man grep を参照するか、tldr ツールで手軽に見られる役立つ例をご覧ください。


執筆者紹介

Ricardo Gerardi is a Principal Consultant at Red Hat, having transitioned from his previous role as a Technical Community Advocate for Enable Sysadmin. He's been at Red Hat since 2018, specializing in IT automation using Ansible and OpenShift.


With over 25 years of industry experience and 20+ years as a Linux and open source enthusiast and contributor, Ricardo is passionate about technology. He is particularly interested in hacking with the Go programming language and is the author of Powerful Command-Line Applications in Go and Automate Your Home Using Go. Ricardo also writes regularly for Red Hat and other blogs, covering topics like Linux, Vim, Ansible, Containers, Kubernetes, and command-line applications.


Outside of work, Ricardo enjoys spending time with his daughters, reading science fiction books, and playing video games.

Read full bio
UI_Icon-Red_Hat-Close-A-Black-RGB

チャンネル別に見る

automation icon

自動化

テクノロジー、チームおよび環境に関する IT 自動化の最新情報

AI icon

AI (人工知能)

お客様が AI ワークロードをどこでも自由に実行することを可能にするプラットフォームについてのアップデート

open hybrid cloud icon

オープン・ハイブリッドクラウド

ハイブリッドクラウドで柔軟に未来を築く方法をご確認ください。

security icon

セキュリティ

環境やテクノロジー全体に及ぶリスクを軽減する方法に関する最新情報

edge icon

エッジコンピューティング

エッジでの運用を単純化するプラットフォームのアップデート

Infrastructure icon

インフラストラクチャ

世界有数のエンタープライズ向け Linux プラットフォームの最新情報

application development icon

アプリケーション

アプリケーションの最も困難な課題に対する Red Hat ソリューションの詳細

Original series icon

オリジナル番組

エンタープライズ向けテクノロジーのメーカーやリーダーによるストーリー